Re[2]: Получить итератор элемента vector по индексу ?
От: Init64  
Дата: 13.02.06 15:22
Оценка:
Здравствуйте, Dmitry Kotlyarov, Вы писали:

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


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


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


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



DK>Используй


DK>
DK>&v.begin()[Index];
DK>

DK>или

DK>
DK>&v[Index];
DK>


Альтернативный вариант:



// получаем ссылку на сам элемент вектора
data& dataValue = vec1.at(index);
Re[11]: Получить итератор элемента vector по индексу ?
От: sadomovalex Россия http://sadomovalex.blogspot.com
Дата: 13.02.06 15:31
Оценка:
Здравствуйте, srggal, Вы писали:

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


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


S>Да, именно об этом я и грю.


для меня это существенным образом не изменило бы картину.. было б удобно использовать такой синтаксис:
list<int>::iterator it = std::advance(l.begin(), n);

но здесь без временных объектов не обошлось бы
"Что не завершено, не сделано вовсе" Гаусс
Re[12]: Получить итератор элемента vector по индексу ?
От: Venn Украина  
Дата: 13.02.06 15:37
Оценка:
On Mon, 13 Feb 2006 17:31:58 +0200, sadomovalex <28937@users.rsdn.ru>
wrote:

> list<int>::iterator it = std::advance(l.begin(), n);


для этого используется
list<int>::iterator it = l.begin() + n;
Posted via RSDN NNTP Server 1.9
Re[12]: Получить итератор элемента vector по индексу ?
От: srggal Украина  
Дата: 13.02.06 15:43
Оценка:
Здравствуйте, sadomovalex, Вы писали:


S>для меня это существенным образом не изменило бы картину.. было б удобно использовать такой синтаксис:

S>
S>list<int>::iterator it = std::advance(l.begin(), n);
S>

S>но здесь без временных объектов не обошлось бы

Дык в данном случае возможна оптимизация компилятором и то, на то и получится.

Ваш пример можно чуть усложнить:
if ( l.size() > n  )
{
    std::for_each( std::advance(l.begin(), n), l.end(), op );
}
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[13]: Получить итератор элемента vector по индексу ?
От: Аноним  
Дата: 13.02.06 17:20
Оценка:
Здравствуйте, Venn, Вы писали:

V>On Mon, 13 Feb 2006 17:31:58 +0200, sadomovalex <28937@users.rsdn.ru>

V>wrote:

>> list<int>::iterator it = std::advance(l.begin(), n);


V>для этого используется

V>list<int>::iterator it = l.begin() + n;

попробуйте скомпилить это
Re[2]: Получить итератор элемента vector по индексу ?
От: Кодт Россия  
Дата: 13.02.06 17:23
Оценка:
Здравствуйте, Dmitry Kotlyarov, Вы писали:

Ты исходишь из допущения, что std::vector<T>::iterator — это T*. Это, в общем случае, несправедливо. (Например, отладочная версия STLPort).

DK>Используй

DK>&v.begin()[Index];

У итератора нет operator[].
DK>или
DK>&v[Index];

А это — просто указатель на Index'ый элемент вектора.
Перекуём баги на фичи!
Re[13]: Получить итератор элемента vector по индексу ?
От: kan_izh Великобритания  
Дата: 13.02.06 17:26
Оценка:
Venn wrote:
> для этого используется
> list<int>::iterator it = l.begin() + n;
+ только для random access iterators.
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[13]: Получить итератор элемента vector по индексу ?
От: kan_izh Великобритания  
Дата: 13.02.06 17:33
Оценка:
srggal wrote:

> Для меня это не рациональный ответ, ибо такая "забота" о пользователях

> итераторов никоим образом не согласуется с тем, что во многих случаях
> пользователь итераторов должен быть внимателен дабы не насиупить на грабли:
> — *end();
Извини, это не грабли, это концептуальное понятие end-итератора. Иначе было бы большим извращением задавать пустые
интервалы.
Ты же не считаешь граблями a[size_of_array_a]?

> — std::find( cont1.begin(), cont2.end() );

Это да... range не хватает.

> Кроме того:

>
> const_iterator current = cont.begin();
> const_iterator next;
> std::advance(next, 0);
>
> if(*current != *next)
> {
> ...
> }
Не заметить то, что здесь не инициализируется переменная куда проще, чем отстутствие const у первого аргумента advance.
Тем более у меня часто руки чесались писать код, который я приводил, но получал по рукам от компилера.
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[14]: Получить итератор элемента vector по индексу ?
От: srggal Украина  
Дата: 13.02.06 17:40
Оценка:
Здравствуйте, kan_izh, Вы писали:

_>Извини, это не грабли, это концептуальное понятие end-итератора. Иначе было бы большим извращением задавать пустые

_>интервалы.
_>Ты же не считаешь граблями a[size_of_array_a]?

>> — std::find( cont1.begin(), cont2.end() );

_>Это да... range не хватает.

Я и имел в виду, что концептуально — итераторы не безопасты. И приведенный пример — не идет в разрез с концептуальной опасностью итераторов.
... << RSDN@Home 1.1.4 stable rev. 510>>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.