假设我有一个向量:
std::vector<Foo> v;
Run Code Online (Sandbox Code Playgroud)
此向量已排序,因此相等的元素彼此相邻。
获得所有表示具有相等元素的范围的迭代器对的最佳方法是什么(使用标准库)?
while (v-is-not-processed) {
iterator b = <begin-of-next-range-of-equal-elements>;
iterator e = <end-of-next-range-of-equal-elements>;
for (iterator i=b; i!=e; ++i) {
// Do something with i
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道如何在上面的代码中获取b和的值e。
因此,例如,如果v包含以下数字:
index 0 1 2 3 4 5 6 7 8 9
value 2 2 2 4 6 6 7 7 7 8
Run Code Online (Sandbox Code Playgroud)
然后,我想在循环中具有b并e指向元素:
iteration b e
1st 0 3
2nd 3 4
3rd 4 6
4th 6 9
5th …Run Code Online (Sandbox Code Playgroud) 考虑接受一个或多个参数(例如文件名)的函数.为了使其具有通用性,将其编写为通用迭代器范围是有利的:
template<class Iter>
void function(Iter first, Iter last)
{
// do something
}
Run Code Online (Sandbox Code Playgroud)
现在我们可以通过以下方式调用它,与我们存储参数的方式无关:
WhateverContainer container;
function(std::begin(container), std::end(container));
Run Code Online (Sandbox Code Playgroud)
例如,STL在很大程度上依赖于这种范例.
现在,假设我们想要使用未存储在容器中的单个参数来调用该函数.我们当然可以写:
const int value = 5;
std::vector<int> vec(1, value);
function(std::begin(vec), std::end(vec));
Run Code Online (Sandbox Code Playgroud)
但这个解决方案对我来说似乎很笨拙和浪费.
问题:是否有更好的低开销方法来创建单个变量的迭代器范围兼容表示?
C++中的标准库容器具有采用迭代器范围的构造函数.当输入容器的内容可以转换为结果容器中的内容但不相同时,或者即使容器只是不同,这也很方便.构造函数重载允许这种类型的转换发生在周围类的构造函数中,这导致代码中的混乱更少.
所以问题出现了,为什么Qt容器没有这个过载?这是一个疏忽还是这个笨重的设计选择背后的原因是什么?