我有一个multiset,我从中得到了一个范围。我想在一个向量中添加这个范围以便以后使用它,这就是我正在做的事情:
class foo
{
public:
int a;
foo(int a) : a(a){}
};
class FooPointerCompare
{
public:
bool operator()(const foo* a, const foo* b)
{
return a->a < b->a;
}
};
std::multiset<foo*, FooPointerCompare> m;
std::vector<std::multiset<foo*, FooPointerCompare>::iterator> v;
auto pair = m.equal_range(new foo(5)); //leak here, I know
v.insert(v.end(), pair.first, pair.second);
但我收到了这些错误:
No matching constructor for initialization of 'std::__1::__tree_const_iterator<foo *, const std::__1::__tree_node<foo *, void *> *, int>'
No viable overloaded '='
当我使用简单的for(auto it = pair.first; it != pair.second; it++) v.push_back(it);
时,它完美无缺。我的vector::insert
电话有什么问题?
答案 0 :(得分:3)
那是什么问题
v.insert(v.end(), pair.first, pair.second);
相当于
for (auto it = pair.first; it != pair.second; ++ it)
v.push_back(*it);
// ^
这与你的意图不一样。我不认为有任何标准算法可以做你想要的。你最好写出for循环。
答案 1 :(得分:3)
vector::insert
期望迭代器指向要插入到向量中的值。
由于你有一个迭代器向量,你必须传递迭代迭代器的东西。但是你传递的东西会迭代你的多重集中的元素。
因此,由于您无法做到这一点而失败:
std::vector<char*> v;
char foo[10];
v.insert(v.end(), foo, foo+10);
或:
std::vector<int> v;
v.insert(v.end(), 0, 10);
所有三个问题的一个解决方案是boost::counting_iterator
。在你的情况下:
v.insert(v.end(),
boost::make_counting_iterator(pair.first),
boost::make_counting_iterator(pair.second)
);