Здравствуйте, Dmitry Kotlyarov, Вы писали:
DK>Здравствуйте, Аноним, Вы писали:
А>>Требуется получить итератор на элемент вектора, то есть, что-то вроде:
А>>
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 по индексу ?
Ты исходишь из допущения, что std::vector<T>::iterator — это T*. Это, в общем случае, несправедливо. (Например, отладочная версия STLPort).
DK>Используй
DK>&v.begin()[Index];
У итератора нет operator[]. DK>или
DK>&v[Index];
А это — просто указатель на Index'ый элемент вектора.
Перекуём баги на фичи!
Re[13]: Получить итератор элемента vector по индексу ?
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 по индексу ?
Здравствуйте, kan_izh, Вы писали:
_>Извини, это не грабли, это концептуальное понятие end-итератора. Иначе было бы большим извращением задавать пустые _>интервалы. _>Ты же не считаешь граблями a[size_of_array_a]?
>> — std::find( cont1.begin(), cont2.end() ); _>Это да... range не хватает.
Я и имел в виду, что концептуально — итераторы не безопасты. И приведенный пример — не идет в разрез с концептуальной опасностью итераторов.