在Python中,访问数组的[-1]
'元素给出最后一个元素,[-2]
索引倒数第二个元素。
C ++中是否有类似的漂亮语法以反向顺序访问std::vector
元素?
答案 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 << ' ';
}