C + + ,复制设置为向量

我需要复制 std::setstd::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

问题出在哪里?

179643 次浏览

你需要使用 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());

您没有在向量对象中保留足够的空间来容纳集合的内容。

std::vector<double> output(input.size());
std::copy(input.begin(), input.end(), output.begin());

不能使用 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的替代方案:

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;
}

这样,我们将只为每个元素调用复制建构子,而不是先调用缺省构造函数,然后为上面列出的其他解决方案复制赋值操作符。下面有更多的说明。

  1. Back _ insert 可以使用,但是它会在向量上调用 push _ back () (https://en.cppreference.com/w/cpp/iterator/back_insert_iterator). Emplace _ back () 效率更高,因为它避免了在使用 Push _ back ()时创建临时文件 构造的类型,但是对于 非平凡构造的类型(例如 std: : string)。

  2. 我们需要避免构造一个带有大小参数的向量 导致默认构造的所有元素 解决方案使用 : copy (),例如。

  3. 最后,分配()方法或采用迭代器范围的构造函数都不是好的选择 因为它们将调用 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)) ;