在 std::vector 中插入迭代器范围
Inserting iterator range in std::vector
我有一个多重集合,我从中得到了一个范围。我想在向量中添加这个范围以便稍后使用它,这就是我正在做的事情:
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)
);
相关文章:
- 转到基于范围的 for 循环中的下一个迭代器
- C++:返回一个基于范围 for 循环迭代器,其中包含继承对象
- 迭代器范围的平衡分区,没有LegacyRandomAccessIterator
- 为什么范围算法与 std 的迭代器不兼容?
- Deque 迭代器超出范围
- unordered_set范围插入与迭代器
- 类型不可知的抽象以使用相同的运行时接口处理正向和反向迭代器和范围?
- C 迭代器范围使用指针到数组
- 将迭代器范围复制到矢量而不重复
- 在 std::vector 中插入迭代器范围
- 有效的迭代器范围从堆栈上的char
- 获取迭代器范围的每个第 n 个元素
- 是否可以将基于范围的for循环与迭代器范围一起使用
- <algorithm>在同一输入迭代器范围内并排运行两个
- std::不带模板的数组迭代器范围
- 迭代器范围矢量构造或矢量擦除更快
- 返回迭代器范围(主列表的子集)
- 为什么标准不允许 std::for_each 对无效的随机访问迭代器范围有明确定义的行为?
- 使用不同类型容器的迭代器范围初始化容器
- 多态过滤器迭代器范围