我需要复制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
问题出在哪里?
Answers:
您需要使用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),这将是一个性能暗示。
我们需要避免使用带有size参数的向量来构造矢量,这会导致默认构造所有元素(一无所获)。例如,与使用std :: copy()的解决方案类似。
最后,vector :: assign()方法或采用迭代器范围的构造方法也不是很好的选择,因为它们将在以下位置调用std :: distance()(以了解元素数)集合迭代器。这将对所有set元素造成不必要的额外迭代,因为set是Binary Search Tree数据结构,并且没有实现随机访问迭代器。
希望有帮助。
back_inserter
不需要使用a
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());