OE>что-то я туплю к вечеру — есть вектор, я в нем чем-то ищу, получаю iterator it, чтоб узнать индекс элемента делаю it — vect.begin(), теперь тоже для reverse_iterator — ищу от rbegin() до rend(), получаю reverse_iterator rit — что от чего надо отнять чтоб узнать индекс элемента на который указывает rit? OE>Я уж и так и эдак — то отрицательное значение, то левое какое-то
ЮБ>>У Мейерса в "Эффективном использвовании STL" Совет 28 стр 117 написано про base()
у него там картинка "неправильная", моя лучше
из нее по крайней мере сразу видно почему при приведении reverse_iterator к iterator при помощи base() он начинает указывать на другой элемент, на одну позицию правее.
вообщем получается так:
for ( vector<int>::reverse_iterator rit = vec.rbegin(); rit != vec.rend(); ++rit)
{
cout << "rit: index of element " << *rit
<< " is: " << (vec.rend() - rit) - 1 << endl;
}
inserted: 0 1 2 3 4 5
rit: index of element 5 is: 5
rit: index of element 4 is: 4
rit: index of element 3 is: 3
rit: index of element 2 is: 2
rit: index of element 1 is: 1
rit: index of element 0 is: 0
что-то я туплю к вечеру — есть вектор, я в нем чем-то ищу, получаю iterator it, чтоб узнать индекс элемента делаю it — vect.begin(), теперь тоже для reverse_iterator — ищу от rbegin() до rend(), получаю reverse_iterator rit — что от чего надо отнять чтоб узнать индекс элемента на который указывает rit?
Я уж и так и эдак — то отрицательное значение, то левое какое-то
Не откладывай на завтра то, что можно сделать послезавтра
Здравствуйте, Vasiliy_Krasnokutsky, Вы писали:
VK>по аналогии с тем, что вы написали надо сделать так: rbegin() — rit
подправим программку из предидущего ответа
int _tmain( int argc, _TCHAR* argv[] )
{
vector<int> vec;
for ( int i = 0; i < 6; ++i )
vec.push_back( i );
vector<int>::reverse_iterator rit = vec.rbegin();
++rit;
++rit;
++rit;
cout << "position of element " << *rit
<< " is: " << vec.rbegin() - rit << endl;
getch();
}
А (rit — vec.begin()) не пробовал? Правда, возможно, кастинг потребуется. Но по идее и vector::iterator и vector::reverse_iterator — это просто указатели, так что должно пройти
Здравствуйте, Андрей, Вы писали:
А>А (rit — vec.begin()) не пробовал? Правда, возможно, кастинг потребуется. Но по идее и vector::iterator и vector::reverse_iterator — это просто указатели, так что должно пройти
напрямую их компилятор друг из друга вычитать не дает, а с приведением:
int _tmain( int argc, _TCHAR* argv[] )
{
vector<int> vec;
cout << "inserted: ";
for ( int i = 0; i < 6; ++i )
{
cout << i << " ";
vec.push_back( i );
}
cout << endl;
vector<int>::reverse_iterator rit = vec.rbegin();
vector<int>::iterator it = vec.begin();
++rit; ++it;
++rit; ++it;
++rit;
cout << "rit: position of element " << *rit
<< " is: " << rit.base() - vec.begin() << endl;
cout << "it : position of element " << *it
<< " is: " << it - vec.begin() << endl;
getch();
}
получаем:
inserted: 0 1 2 3 4 5
rit: position of element 2 is: 3
it : position of element 2 is: 2
OE>inserted: 0 1 2 3 4 5
OE>position of element 2 is: 3
OE>
Давай с rit++ спешить не будем
#include <vector>
#include <iostream>
using namespace std;
int _tmain( int argc, _TCHAR* argv[] )
{
vector<int> vec;
for ( int i = 0; i < 6; ++i )
vec.push_back( i );
vector<int>::reverse_iterator rit = vec.rbegin();
rit;
cout << "position of element " << *rit << endl;
cout << distance(vec.rbegin(), rit) << endl;
cout << distance(vec.begin(), rit.base()) << endl;
}
position of element 5
0
6
У Мейерса в "Эффективном использвовании STL" Совет 28 стр 117
написано про base()