我需要复制 std::set到 std::vector:
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:
back_inserter
std::copy(input.begin(), input.end(), std::back_inserter(output));
std::copy不会向要插入的容器中添加元素: 它不能; 它只在容器中有一个迭代器。因此,如果将输出迭代器直接传递给 std::copy,则必须确保它指向的范围至少足以容纳输入范围。
std::copy
std::back_inserter为每个元素创建一个输出迭代器,该迭代器在容器上调用 push_back,因此每个元素都被插入到容器中。或者,您可以在 std::vector中创建足够数量的元素来保存正在复制的范围:
std::back_inserter
push_back
std::vector<double> output(input.size()); std::copy(input.begin(), input.end(), output.begin());
或者,您可以使用 std::vector范围构造函数:
std::vector<double> output(input.begin(), input.end());
您没有在向量对象中保留足够的空间来容纳集合的内容。
不能使用 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()));
只要使用带有迭代器的向量的构造函数:
std::set<T> s; //... std::vector v( s.begin(), s.end() );
假设只需要 v 中的 s 的内容,在将数据复制到 v 之前,v 中没有任何内容。
这里还有一个使用 vector::assign的替代方案:
vector::assign
theVector.assign(theSet.begin(), theSet.end());
我认为最有效的方法是预先分配,然后安置元素:
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 _ insert 可以使用,但是它会在向量上调用 push _ back () (https://en.cppreference.com/w/cpp/iterator/back_insert_iterator). Emplace _ back () 效率更高,因为它避免了在使用 Push _ back ()时创建临时文件 构造的类型,但是对于 非平凡构造的类型(例如 std: : string)。
我们需要避免构造一个带有大小参数的向量 导致默认构造的所有元素 解决方案使用 : copy (),例如。
最后,分配()方法或采用迭代器范围的构造函数都不是好的选择 因为它们将调用 std: : length ()(了解元素的数量) 这将导致不必要的额外迭代 通过所有的 abc 0元素,因为集合是二叉查找树的 数据结构,并且不实现随机访问迭代器
希望能帮上忙。
set<T> s; // some code vector<T> v; v.assign(s.begin(), s.end());
COPY 函数返回目标范围末尾的迭代器(它指向最后复制的元素之后的元素)。
后插入迭代器是一种特殊类型的输出迭代器,其设计目的是允许通常覆盖元素(例如拷贝)的算法在容器末尾自动插入新元素。
设定操作系统; 矢量;
Copy (os.start ()、 os.end ()、 back _ insert (vec)) ;