如何将迭代器增加2?

时间:2009-06-29 10:05:33

标签: c++ visual-c++ stl iterator

有人能告诉我如何将迭代器增加2?

iter++可用 - 我必须iter+2吗?我怎样才能做到这一点?

8 个答案:

答案 0 :(得分:89)

std::advance( iter, 2 );

此方法适用于非随机访问迭代器的迭代器,但当与随机访问迭代器一起使用时,实现仍然可以使其专用于iter += 2

答案 1 :(得分:25)

http://www.cplusplus.com/reference/std/iterator/advance/

std::advance(it,n);

其中n为2。

这个函数的优点是,如果“it”是随机访问迭代器,那么快速

it += n
使用

操作(即矢量<,> :: iterator)。否则将其渲染为

for(int i = 0; i < n; i++)
    ++it;

(即list&lt; ..&gt; :: iterator)

答案 2 :(得分:15)

如果你没有迭代器的可修改左值,或者希望获得给定迭代器的副本(保留原始迭代器不变),那么C ++ 11带有新的辅助函数 - {{3 } / std::next

std::next(iter, 2);          // returns a copy of iter incremented by 2
std::next(std::begin(v), 2); // returns a copy of begin(v) incremented by 2
std::prev(iter, 2);          // returns a copy of iter decremented by 2

答案 3 :(得分:7)

您可以使用'添加分配'操作符

iter += 2;

答案 4 :(得分:4)

如果您不知道容器中是否有足够的下一个元素,则需要在每个增量之间检查容器的末端。 ++和std :: advance都不会为你做这件事。

if( ++iter == collection.end())
  ... // stop

if( ++iter == collection.end())
  ... // stop

您甚至可以推出自己的绑定安全提前功能。

如果您确定不会结束,那么std :: advance(iter,2)是最好的解决方案。

答案 5 :(得分:1)

我们可以同时使用advance和next。但是,两者之间存在差异。 &#34;预先&#34;修改其参数并返回任何内容。因此,它可以用作:

vector<int> v;
v.push_back(1);
v.push_back(2);
auto itr = v.begin();
advance(itr, 1);           //modifies the itr
cout << *itr<<endl        //prints 2

&#34;下一个&#34;返回迭代器的修改副本

vector<int> v;
v.push_back(1);
v.push_back(2);
cout << *next(v.begin(), 1) << endl;    //prints 2

答案 6 :(得分:0)

假设列表大小可能不是步骤的偶数倍,则必须防止溢出:

static constexpr auto step = 2;

// Guard against invalid initial iterator.
if (!list.empty())
{
    for (auto it = list.begin(); /*nothing here*/; std::advance(it, step))
    {
        // do stuff...

        // Guard against advance past end of iterator.
        if (std::distance(it, list.end()) > step)
            break;
    }
}

根据集合实现,距离计算可能非常慢。以下是最佳且更易读的。闭包可以更改为实用程序模板,其中列表结束值由const引用传递:

const auto advance = [&](list_type::iterator& it, size_t step)
{
    for (size_t i = 0; it != list.end() && i < step; std::next(it), ++i);
};

static constexpr auto step = 2;

for (auto it = list.begin(); it != list.end(); advance(it, step))
{
    // do stuff...
}

如果没有循环:

static constexpr auto step = 2;
auto it = list.begin();

if (step <= list.size())
{
    std::advance(it, step);
}

答案 7 :(得分:-5)

非常简单的答案:

++++iter

答案很长:

你真的应该习惯写++iter而不是iter++。后者必须返回旧值的副本(与旧值不同);这需要时间和空间。

请注意,前缀增量(++iter)采用左值并返回左值,而后缀增量(iter++)采用左值并返回右值。