从 vector::iterator 得到 vector::reverse_iterator?
Getting a vector::reverse_iterator from a vector::iterator?
我在遍历 std::vector
时遇到问题。我在 while 循环中使用 std::vector::iterator
进行迭代,在我的循环中的某个时刻,我想要一个 std::vector::reverse_iterator
指向与 iterator
相同的元素。但我不知道如何正确处理。
这里有一个片段可以帮助您理解我的问题。在这里,例如,我有包含 (1,2,3,4,5,6,7) 的 tab
向量,我想打印出如下内容:
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;
我希望我的问题很清楚,谢谢你的帮助。 :)
给定一对任意迭代器,如 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;
您可以从迭代器构造反向迭代器。要记住的重要一点是,当你这样做时,它会返回一个元素。如果你这样做:
std::vector<int>::reverse_iterator rit(foo.begin());
foo.begin
指向第一个元素,其中 rit
将指向第一个元素之前的元素。这样你的for循环就可以变成
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;
}
std::vector<int>::reverse_iterator j{i+1};
的反向迭代器总是有一个 "base",一个基本迭代器的实例。我不确定原因,但他们希望这个基础实例具有相同的端点,即 v.begin()==v.rend(), v.end()==v.rbegin()
。这意味着为了得到一个指向同一个端点的迭代器,你有一个偏移量:
v.begin()+10==
v.rend()-10-1==
reverse_iterator(v.begin()+10+1)==
reverse_iterator(v.begin()+10)-1
我在遍历 std::vector
时遇到问题。我在 while 循环中使用 std::vector::iterator
进行迭代,在我的循环中的某个时刻,我想要一个 std::vector::reverse_iterator
指向与 iterator
相同的元素。但我不知道如何正确处理。
这里有一个片段可以帮助您理解我的问题。在这里,例如,我有包含 (1,2,3,4,5,6,7) 的 tab
向量,我想打印出如下内容:
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;
我希望我的问题很清楚,谢谢你的帮助。 :)
给定一对任意迭代器,如 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;
您可以从迭代器构造反向迭代器。要记住的重要一点是,当你这样做时,它会返回一个元素。如果你这样做:
std::vector<int>::reverse_iterator rit(foo.begin());
foo.begin
指向第一个元素,其中 rit
将指向第一个元素之前的元素。这样你的for循环就可以变成
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;
}
std::vector<int>::reverse_iterator j{i+1};
的反向迭代器总是有一个 "base",一个基本迭代器的实例。我不确定原因,但他们希望这个基础实例具有相同的端点,即 v.begin()==v.rend(), v.end()==v.rbegin()
。这意味着为了得到一个指向同一个端点的迭代器,你有一个偏移量:
v.begin()+10==
v.rend()-10-1==
reverse_iterator(v.begin()+10+1)==
reverse_iterator(v.begin()+10)-1