reverse_iterator
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 13.03.03 14:20
Оценка:
что-то я туплю к вечеру — есть вектор, я в нем чем-то ищу, получаю iterator it, чтоб узнать индекс элемента делаю it — vect.begin(), теперь тоже для reverse_iterator — ищу от rbegin() до rend(), получаю reverse_iterator rit — что от чего надо отнять чтоб узнать индекс элемента на который указывает rit?
Я уж и так и эдак — то отрицательное значение, то левое какое-то
Не откладывай на завтра то, что можно сделать послезавтра
Re: reverse_iterator
От: Vasiliy_Krasnokutsky Россия  
Дата: 13.03.03 14:35
Оценка:
Здравствуйте, Odi$$ey,

по аналогии с тем, что вы написали надо сделать так: rbegin() — rit
Re: Re: reverse_iterator
От: promko Украина  
Дата: 13.03.03 17:33
Оценка:
>что от чего надо отнять чтоб узнать индекс элемента на который указывает rit?
vector<int> vec;
for(int i=1; i<6; ++i)
vec.push_back(i);
vector<int>::reverse_iterator rit = vec.rbegin();
++rit;++rit;++rit;
cout << "position of element " << *rit 
<< " is: " << vec.rend()-rit << endl;
Posted via RSDN NNTP Server 1.4.5
Re[2]: Re: reverse_iterator
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 14.03.03 04:12
Оценка:
Здравствуйте, promko, Вы писали:

>>что от чего надо отнять чтоб узнать индекс элемента на который указывает rit?

P>
P>vector<int> vec;
P>for(int i=1; i<6; ++i)
P>vec.push_back(i);
P>vector<int>::reverse_iterator rit = vec.rbegin();
P>++rit;++rit;++rit;
P>cout << "position of element " << *rit 
P><< " is: " << vec.rend()-rit << endl; 
P>


исправим for(int i=0; i<6; ++i), т.к. индексы идут с 0, запустим и получим

position of element 2 is 3
Hе плыви по течению. Hе плыви против течения. Плыви туда, куда тебе нужно.
Re[2]: reverse_iterator
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 14.03.03 04:12
Оценка:
Здравствуйте, 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();
}


получим

position of element 2 is: -3
В пивной: Мертвой рыбой по столу не стучать!
Re[3]: Re: reverse_iterator
От: Андрей Россия  
Дата: 14.03.03 04:46
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

skip

А (rit — vec.begin()) не пробовал? Правда, возможно, кастинг потребуется. Но по идее и vector::iterator и vector::reverse_iterator — это просто указатели, так что должно пройти
Re[3]: reverse_iterator
От: Юнусов Булат Россия  
Дата: 14.03.03 04:52
Оценка: 3 (1)
Здравствуйте, Odi$$ey, Вы писали:

    cout <<  distance(vec.rbegin(), rit) << endl;
       // или
    cout <<  distance(vec.begin(), rit.base()) << endl;
Re[4]: reverse_iterator
От: Юнусов Булат Россия  
Дата: 14.03.03 05:06
Оценка:
Здравствуйте, Юнусов Булат, Вы писали:

ЮБ>Здравствуйте, Odi$$ey, Вы писали:


ЮБ>
ЮБ>    cout <<  distance(vec.rbegin(), rit) << endl;
ЮБ>       // или
ЮБ>    cout <<  distance(vec.begin(), rit.base()) << endl;

ЮБ>


первый вариант — расстояние относительно конца
а второй от начала вектора
Re[4]: reverse_iterator
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 14.03.03 05:10
Оценка:
Здравствуйте, Юнусов Булат, Вы писали:

ЮБ>Здравствуйте, Odi$$ey, Вы писали:


ЮБ>
ЮБ>    cout <<  distance(vec.rbegin(), rit) << endl;
ЮБ>       // или
ЮБ>    cout <<  distance(vec.begin(), rit.base()) << endl;

ЮБ>


inserted: 0 1 2 3 4 5
position of element 2 is: 3
<no any citation>
Re[4]: Re: reverse_iterator
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 14.03.03 05:21
Оценка:
Здравствуйте, Андрей, Вы писали:

А>А (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
<no any citation>
Re[5]: reverse_iterator
От: Юнусов Булат Россия  
Дата: 14.03.03 05:27
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

OE>
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()
Индекс в vector по reverse_iterator
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 14.03.03 06:04
Оценка: 6 (2)
#Имя: FAQ.cpp.reverse_iterator
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
<no any citation>
Re[3]: Re: Re[2]: Re: reverse_iterator
От: promko Украина  
Дата: 14.03.03 14:20
Оценка:
"Odi$$ey" <forum@rsdn.ru> wrote in message news:213803@news.rsdn.ru...

> исправим for(int i=0; i<6; ++i), т.к. индексы идут с 0, запустим и получим

>
> position of element 2 is 3
>

извеняюсь — поспешил
Posted via RSDN NNTP Server 1.4.5
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.