我有问题迭代和std::vector
。我在while循环中使用std::vector::iterator
进行迭代,并且在某个时刻进入我的循环,我希望std::vector::reverse_iterator
指向与iterator
相同的元素。但我无法弄清楚如何做到正确。
这是一个帮助您了解我的问题的片段。在这里,例如,我有tab
向量包含(1,2,3,4,5,6,7),我想打印出类似的东西:
1
21
321
4321
54321
654321
7654321
这是我首先想到的代码:
std::vector<int> tab {1, 2, 3, 4, 5, 6, 7}; // C++11 needed here, if I recall correctly
for(std::vector<int>::iterator i(tab.begin()) ; i != tab.end() ; ++i) {
for(std::vector<int>::reverse_iterator j(/* ? */) ; j != tab.rend() ; ++j) {
std::cout << *j;
}
std::cout << std::endl;
我希望我的问题很明确,谢谢你的帮助。 :)
答案 0 :(得分:2)
您可以从迭代器构造反向迭代器。要记住的重要一点是,当你这样做时,它会在这样做时返回一个元素。如果你这样做:
std::vector<int>::reverse_iterator rit(foo.begin());
foo.begin
指向第一个元素,其中rit
将指向第一个元素之前的一个元素。有了这个你可以成为循环
std::vector<int> tab {1, 2, 3, 4, 5, 6, 7}; // C++11 needed here, if I recall correctly
for(std::vector<int>::iterator i(tab.begin()) ; i != tab.end() ; ++i) {
for(std::vector<int>::reverse iterator j(i + 1) ; j != tab.rend() ; ++j) {
std::cout << *j;
}
std::cout << std::endl;
}
答案 1 :(得分:1)
给定一对像tab.begin()
和i
这样的任意迭代器,你可以使用std::reverse_iterator
来反转它们,模糊地如下:
for(std::vector<int>::iterator i(tab.begin()) ; i != tab.end() ; ++i) {
typedef std::reverse_iterator<std::vector<int>::iterator> riterator;
riterator start = riterator(i); //start toward the back-ish
riterator stop = riterator(tab.begin()) //stop at the front
for(riterator j=start; j!=stop; ++j)
std::cout << *j;
答案 2 :(得分:1)
std::vector<int>::reverse_iterator j{i+1};
反向迭代器总是有一个“base”,一个基础迭代器的实例。我不确定推理,但是他们希望这个基本实例具有相同的端点,即v.begin()==v.rend(), v.end()==v.rbegin()
。这意味着为了使迭代器指向同一个端点,您的偏移量为1:
v.begin()+10==
v.rend()-10-1==
reverse_iterator(v.begin()+10+1)==
reverse_iterator(v.begin()+10)-1