干净的方式以相反的顺序访问std :: vector元素?

时间:2014-07-29 19:54:43

标签: c++ stdvector

在Python中,访问数组的[-1]'元素给出最后一个元素,[-2]索引倒数第二个元素。

C ++中是否有类似的漂亮语法以反向顺序访问std::vector元素?

5 个答案:

答案 0 :(得分:8)

Revese iterators:

for (auto it = v.rbegin(); it != v.rend(); ++it)
{

}

如果要从末尾访问第i个元素:

*(v.rbegin() + i)

或者,如果你不想看起来像一个全知的话:

*(v.end() - i - 1)

请注意,在Python中,您实际上会使用v[-i-1]来获取相同的元素,因此这个元素使用相同的数字。

技巧是向量迭代器为RandomAccessIterator,因此您可以为它们添加和减去索引。

答案 1 :(得分:3)

首先,其他答案很棒,而这只是对它们的补充。请注意,std::vector::reverse_iterator是一个随机访问迭代器。这意味着您可以在其上使用operator[]。特别是,从最后一个开始的i元素是v.rbegin()[i]。为方便起见,您可以定义变量auto rv = v.rbegin();,然后使用rv[i]访问v[size-1-i]

答案 2 :(得分:0)

您可以使用反向迭代器。 Here你有一个完整的例子来说明:。

但是如果你不想使用循环遍历向量中的所有中间元素,你也可以(以及反向迭代器)std::advance(它也会遍历向量,就像你用它做的那样)环)。 Link to documentation

您也可以采用经典方式:访问您要执行的最后一个元素vector[vector.size()-1],以便从末尾vector[vector.size()-2]访问第二个元素。我想你已经知道它并且要求一个Python外观解决方案,但我不知道类似的东西。可能(但我不确定)有一些方法可以重载[]的{​​{1}}运算符以允许您要求的内容。在这里,有人要求对矢量的操作方式进行一些更改:here

希望我的回答很有帮助。

答案 3 :(得分:0)

虽然@ rodrigo的答案很好地解决了这个问题,但我想再补充一点关于循环std::vector的问题。

在Python中,循环遍历列表(或一般的可迭代序列)如下:

mylist = [1, 2, 3, 4]

# from beginning to end
for elem in mylist:
    print(elem)

# from end to beginning
for elem in reversed(mylist):
    print(elem)

由于Python的for循环更类似于其他语言中的“foreach”构造,因此C ++中的相应语法实际上使用了STL <algorithm>

// header
#include <algorithm>

// example code
using namespace std;

vector<int> myvector {1, 2, 3, 4};

// forward
for_each(myvector.begin(), myvector.end(), [](int &elem){
    cout << elem << endl;
});

// reverse
for_each(myvector.rbegin(), myvector.rend(), [](int &elem){
    cout << elem << endl;
});

传递给std::for_each()的最后一个参数是一个lambda函数,它以int&为参数。

答案 4 :(得分:0)

使用Boost Range库:

#include <boost/range/adaptors.hpp>
#include <vector>
#include <iostream>

int main()
{
    std::vector<int> v {1,2,3,4,5};
    for (int i : v | boost::adaptors::reversed)
        std::cout << i << ' ';
}