在 std::vector 中插入迭代器范围

Inserting iterator range in std::vector

本文关键字:迭代器 范围 插入 vector std      更新时间:2023-10-16

我有一个多重集合,我从中得到了一个范围。我想在向量中添加这个范围以便稍后使用它,这就是我正在做的事情:

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电话有什么问题?

问题是

v.insert(v.end(), pair.first, pair.second);

相当于

for (auto it = pair.first; it != pair.second; ++ it)
    v.push_back(*it);
//              ^

这与您的意图不同。我认为没有任何标准算法可以做你想做的事。最好只写出 for 循环。

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