にコピーstd::set
する必要がありますstd::vector
:
std::set <double> input;
input.insert(5);
input.insert(6);
std::vector <double> output;
std::copy(input.begin(), input.end(), output.begin()); //Error: Vector iterator not dereferencable
問題はどこだ?
にコピーstd::set
する必要がありますstd::vector
:
std::set <double> input;
input.insert(5);
input.insert(6);
std::vector <double> output;
std::copy(input.begin(), input.end(), output.begin()); //Error: Vector iterator not dereferencable
問題はどこだ?
回答:
を使用する必要がありますback_inserter
:
std::copy(input.begin(), input.end(), std::back_inserter(output));
std::copy
挿入先のコンテナに要素を追加しません。追加できません。コンテナへのイテレータしかない。このため、出力イテレータをに直接渡す場合std::copy
は、少なくとも入力範囲を保持するのに十分な大きさの範囲を指すようにする必要があります。
std::back_inserter
push_back
各要素のコンテナを呼び出す出力イテレータを作成し、各要素がコンテナに挿入されるようにします。あるいは、std::vector
コピーされる範囲を保持するのに十分な数の要素を作成することもできます。
std::vector<double> output(input.size());
std::copy(input.begin(), input.end(), output.begin());
または、std::vector
範囲コンストラクターを使用することもできます。
std::vector<double> output(input.begin(), input.end());
output.insert(output.end(), input.begin(), input.end());
代わりに、私は代わりにただ行うことができませんでしたか?
output.insert(output.cend(), input.cbegin(), input.cend());
どう思いますか?ありがとう。
input,size()
空のエントリの配列を作成し、その後に追加を追加します。使うつもりだと思いますstd::vector<double> output; output.reserve(input.size()); std::copy(...);
。
セットの内容を保持するのに十分なスペースがベクターオブジェクトに予約されていません。
std::vector<double> output(input.size());
std::copy(input.begin(), input.end(), output.begin());
最も効率的な方法は、要素を事前に割り当ててから配置することだと思います。
template <typename T>
std::vector<T> VectorFromSet(const std::set<T>& from)
{
std::vector<T> to;
to.reserve(from.size());
for (auto const& value : from)
to.emplace_back(value);
return to;
}
この方法では、最初に既定のコンストラクターを呼び出してから、上記の他のソリューションの代入演算子をコピーするのではなく、すべての要素に対してコピーコンストラクターのみを呼び出します。以下の詳細説明。
back_inserterを使用することもできますが、ベクター(https://en.cppreference.com/w/cpp/iterator/back_insert_iterator)でpush_back()を呼び出します。 emplace_back()は、push_back()の使用時に一時ファイルを作成しないため、より効率的です。これは、自明に構築された型の問題ではありませんが、自明でない構築型(たとえば、std :: string)のパフォーマンスに影響します。
すべての要素をデフォルトで構築する(何もしない)サイズ引数を使用してベクトルを構築しないようにする必要があります。たとえば、std :: copy()を使用するソリューションと同様です。
そして、最後に、vector :: assign()メソッドまたはイテレーター範囲を取るコンストラクターは、セットイテレーターでstd :: distance()(要素の数を知るため)を呼び出すため、適切なオプションではありません。セットはバイナリ検索ツリーのデータ構造であり、ランダムアクセス反復子を実装していないため、すべてのセット要素で不要な追加の反復が発生します。
お役に立てば幸いです。
back_inserter
使用する必要がないのかなどの機関への参照を追加してください
std::copy
空のコンテナへの挿入には使用できません。そのためには、次のようにinsert_iteratorを使用する必要があります。
std::set<double> input;
input.insert(5);
input.insert(6);
std::vector<double> output;
std::copy(input.begin(), input.end(), inserter(output, output.begin()));
assign()
機能は:output.assign(input.begin(), input.end());