Получить итератор элемента vector по индексу ?
От: Аноним  
Дата: 13.02.06 12:08
Оценка:
По ходу туплю товарищи.

Есть вектор vec1, заполненый некоторыми данными, и есть индекс элемента.
То есть, что бы получить данные из первого вектора нужно выполнить что-то наподобие:

vec1[Index];


Требуется получить итератор на элемент вектора, то есть, что-то вроде:

vector <data> vec1;
vector <data>::iterator itData;
...
itData = GetItByIndex(Index);


Вопрос — как ?
Или я что-то упустил...

Re: Получить итератор элемента vector по индексу ?
От: Venn Украина  
Дата: 13.02.06 12:10
Оценка:
On Mon, 13 Feb 2006 14:08:31 +0200, wrote:


> [ccode]vector <data> vec1;

> vector <data>::iterator itData;
> ...

itData += Index;
Posted via RSDN NNTP Server 1.9
Re: Получить итератор элемента vector по индексу ?
От: srggal Украина  
Дата: 13.02.06 12:11
Оценка:
Здравствуйте, <Аноним>, Вы писали:

vector <data> vec1;
vector <data>::iterator itData;
...
itData = vec1.begin()+Index;
itData = std::advance( begin(), Index );
... << RSDN@Home 1.1.4 stable rev. 510>>
Re: Получить итератор элемента vector по индексу ?
От: ekamaloff Великобритания  
Дата: 13.02.06 12:11
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Требуется получить итератор на элемент вектора, то есть, что-то вроде:


vector <data>::iterator itData = vec1.begin() + Index;

?
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re[2]: Получить итератор элемента vector по индексу ?
От: ekamaloff Великобритания  
Дата: 13.02.06 12:13
Оценка:
Здравствуйте, srggal, Вы писали:

S>Здравствуйте, <Аноним>, Вы писали:


S>
S>itData = std::advance( begin(), Index );
S>


Скорее так:

itData = vec1.begin();
std::advance( itData, Index );
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re[2]: Получить итератор элемента vector по индексу ?
От: srggal Украина  
Дата: 13.02.06 12:15
Оценка:
Здравствуйте, Venn, Вы писали:

V>On Mon, 13 Feb 2006 14:08:31 +0200, wrote:



>> [ccode]vector <data> vec1;

>> vector <data>::iterator itData;
>> ...

V>itData += Index;


itData — в примере АТ — неинициализирован.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[3]: Получить итератор элемента vector по индексу ?
От: srggal Украина  
Дата: 13.02.06 12:16
Оценка:
Здравствуйте, ekamaloff, Вы писали:

E>Скорее так:


E>
E>itData = vec1.begin();
E>std::advance( itData, Index );
E>


Конечно именно так.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re: Получить итератор элемента vector по индексу ?
От: Dmitry Kotlyarov Россия  
Дата: 13.02.06 12:30
Оценка: -3
Здравствуйте, Аноним, Вы писали:

А>Требуется получить итератор на элемент вектора, то есть, что-то вроде:


А>
vector <data> vec1;
А>vector <data>::iterator itData;
А>...
А>itData = GetItByIndex(Index);


А>Вопрос — как ?



Используй

&v.begin()[Index];

или

&v[Index];
Re[3]: Получить итератор элемента vector по индексу ?
От: sadomovalex Россия http://sadomovalex.blogspot.com
Дата: 13.02.06 12:59
Оценка:
Здравствуйте, ekamaloff, Вы писали:

E>Здравствуйте, srggal, Вы писали:


S>>Здравствуйте, <Аноним>, Вы писали:


S>>
S>>itData = std::advance( begin(), Index );
S>>


E>Скорее так:


E>
E>itData = vec1.begin();
E>std::advance( itData, Index );
E>


а какая разница? временный объект будет жив до конца полного выражения, в котором он используется, так что ссылка на него будет валидной до выхода из advance
"Что не завершено, не сделано вовсе" Гаусс
Re[3]: Получить итератор элемента vector по индексу ?
От: Venn Украина  
Дата: 13.02.06 13:04
Оценка: :)
> itData — в примере АТ — неинициализирован.

главное — идею он понял
Posted via RSDN NNTP Server 1.9
Re[4]: Получить итератор элемента vector по индексу ?
От: ekamaloff Великобритания  
Дата: 13.02.06 13:05
Оценка:
Здравствуйте, sadomovalex, Вы писали:

E>>
E>>itData = vec1.begin();
E>>std::advance( itData, Index );
E>>


S>а какая разница? временный объект будет жив до конца полного выражения, в котором он используется, так что ссылка на него будет валидной до выхода из advance


Тут дело немного в другом:

template<class InputIterator, class Distance>
   void advance(
      InputIterator& _InIt, 
      Distance _Off
   );


Первый параметр — итератор, который следует инкрементировать. Возвращаемое значение — void. Делаем выводы.
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re[4]: Получить итератор элемента vector по индексу ?
От: srggal Украина  
Дата: 13.02.06 13:06
Оценка:
Здравствуйте, sadomovalex, Вы писали:

S>а какая разница? временный объект будет жив до конца полного выражения, в котором он используется, так что ссылка на него будет валидной до выхода из advance


Не скомпилится мой вариант, Ибо некорректен.


template<class InputIterator, class Distance>
   void advance(
      InputIterator& _InIt, 
      Distance _Off
   );
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[5]: Получить итератор элемента vector по индексу ?
От: sadomovalex Россия http://sadomovalex.blogspot.com
Дата: 13.02.06 13:17
Оценка:
Здравствуйте, ekamaloff, Вы писали:

E>Здравствуйте, sadomovalex, Вы писали:


E>>>
E>>>itData = vec1.begin();
E>>>std::advance( itData, Index );
E>>>


S>>а какая разница? временный объект будет жив до конца полного выражения, в котором он используется, так что ссылка на него будет валидной до выхода из advance


E>Тут дело немного в другом:


E>
E>template<class InputIterator, class Distance>
E>   void advance(
E>      InputIterator& _InIt, 
E>      Distance _Off
E>   );
E>


E>Первый параметр — итератор, который следует инкрементировать. Возвращаемое значение — void. Делаем выводы.


и точно..
"Что не завершено, не сделано вовсе" Гаусс
Re[6]: Получить итератор элемента vector по индексу ?
От: srggal Украина  
Дата: 13.02.06 13:25
Оценка:
Здравствуйте, sadomovalex, Вы писали:

Юзал advance и не задумывался, а почему он не возвращает ссылку на итератор, а вот ошибся, и задумался, рационального ответа так и не нашел, все только на уровне — "Исторически так сложилось".
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[7]: Получить итератор элемента vector по индексу ?
От: sadomovalex Россия http://sadomovalex.blogspot.com
Дата: 13.02.06 13:46
Оценка:
Здравствуйте, srggal, Вы писали:

S>Здравствуйте, sadomovalex, Вы писали:


S>Юзал advance и не задумывался, а почему он не возвращает ссылку на итератор, а вот ошибся, и задумался, рационального ответа так и не нашел, все только на уровне — "Исторически так сложилось".


наверное для того, чтобы не создавать дополнительных временных объектов
"Что не завершено, не сделано вовсе" Гаусс
Re[8]: Получить итератор элемента vector по индексу ?
От: srggal Украина  
Дата: 13.02.06 13:49
Оценка:
Здравствуйте, sadomovalex, Вы писали:

S>наверное для того, чтобы не создавать дополнительных временных объектов


Я грил о возврате аргумента (по ссылке) первого аргумент.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[9]: Получить итератор элемента vector по индексу ?
От: sadomovalex Россия http://sadomovalex.blogspot.com
Дата: 13.02.06 13:58
Оценка:
Здравствуйте, srggal, Вы писали:

S>Здравствуйте, sadomovalex, Вы писали:


S>>наверное для того, чтобы не создавать дополнительных временных объектов


S>Я грил о возврате аргумента (по ссылке) первого аргумент.


т.е. просто добавить в advance return ?
"Что не завершено, не сделано вовсе" Гаусс
Re[10]: Получить итератор элемента vector по индексу ?
От: srggal Украина  
Дата: 13.02.06 14:04
Оценка:
Здравствуйте, sadomovalex, Вы писали:

S>т.е. просто добавить в advance return ?


Да, именно об этом я и грю.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[11]: Получить итератор элемента vector по индексу ?
От: kan_izh Великобритания  
Дата: 13.02.06 14:40
Оценка:
srggal wrote:

> S>т.е. просто добавить в advance return ?

> Да, именно об этом я и грю.
Видимо, чтобы избежать след. граблей:
const_iterator current = ...;
const_iterator next = advance(current, 1);

if(*current != *next)
{
...
}
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[12]: Получить итератор элемента vector по индексу ?
От: srggal Украина  
Дата: 13.02.06 14:50
Оценка:
Здравствуйте, kan_izh, Вы писали:


Для меня это не рациональный ответ, ибо такая "забота" о пользователях итераторов никоим образом не согласуется с тем, что во многих случаях пользователь итераторов должен быть внимателен дабы не насиупить на грабли:
— *end();
— std::find( cont1.begin(), cont2.end() );
— etc.

Кроме того:
const_iterator current = cont.begin();
const_iterator next; 
std::advance(next, 0);

if(*current != *next)
{
...
}


ЗЫ и Ваш и мой пример притянуты за очень длинные уши
... << RSDN@Home 1.1.4 stable rev. 510>>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.