使用set_union合并两个集合时分配只读位置

时间:2017-09-20 14:29:44

标签: c++ algorithm stl

我正在尝试将两个集合组合为一个集合,但是当我使用最简单的示例时,出现错误:assignment of read-only location '__result.std::_Rb_tree_const_iterator<_Tp>::operator*<int>()'代码为:

set<int> a;
set<int> b;
int x[4] = {0,1,2,3};int y[5] = {1,2,4,6,9};
a.insert(x,x+4);
b.insert(y,y+5);
set<int> c;
set_union(a.begin(), a.end(), b.begin(), b.end(), c.begin());

我写错了吗?如果我想合并两个set并使用新的set来包含元素,我该怎么办?

此行的错误调用:set_union(a.begin(), a.end(), b.begin(), b.end(), c.begin());

1 个答案:

答案 0 :(得分:1)

std::set<int>::iterator不是OutputIterator,因此不适合用作std::set_union的第五个参数。您可能意味着插入c,因此合适的迭代器是std::inserter(c,c.begin())

set_union(a.begin(), a.end(), b.begin(), b.end(), std::inserter(c,c.begin()));

OutputIterator可以指定其指向的值,而std::insert_iterator<std::set<int>>通过返回一个代理对象来实现这一点,该代理对象在分配时插入到集合中,而不是int&

或者,如果您知道将产生多少项(或准备进行分配),您可以使用其他容器的开头,例如std::array<int, 7>std::vector<int>,其大小足以包含联盟产生的7个要素。

std::vector<int> d(a.size() + b.size(), 0); // preallocate enough
std::vector<int>::iterator end = std::set_union(a.begin(), a.end(), b.begin(), b.end(), d.begin());
d.erase(end, d.end()); // clean up any excess elements not from `a` or `b`