标签: iterator-range

如何使用标准库迭代相等的值?

假设我有一个向量:

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)

然后,我想在循环中具有be指向元素:

 iteration  b  e
 1st        0  3
 2nd        3  4
 3rd        4  6
 4th        6  9
 5th …
Run Code Online (Sandbox Code Playgroud)

c++ algorithm c++-standard-library iterator-range c++17

39
推荐指数
5
解决办法
1827
查看次数

将单个参数传递给期望迭代器范围的函数

考虑接受一个或多个参数(例如文件名)的函数.为了使其具有通用性,将其编写为通用迭代器范围是有利的:

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++ iterator stl iterator-range

21
推荐指数
3
解决办法
1707
查看次数

为什么像QList和QVector这样的Qt容器没有迭代器范围构造函数?

C++中的标准库容器具有采用迭代器范围的构造函数.当输入容器的内容可以转换为结果容器中的内容但不相同时,或者即使容器只是不同,这也很方便.构造函数重载允许这种类型的转换发生在周围类的构造函数中,这导致代码中的混乱更少.

所以问题出现了,为什么Qt容器没有这个过载?这是一个疏忽还是这个笨重的设计选择背后的原因是什么?

qt iterator-range

1
推荐指数
1
解决办法
773
查看次数