Есть вектор vec1, заполненый некоторыми данными, и есть индекс элемента.
То есть, что бы получить данные из первого вектора нужно выполнить что-то наподобие:
vec1[Index];
Требуется получить итератор на элемент вектора, то есть, что-то вроде:
Здравствуйте, 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 по индексу ?
E>>itData = vec1.begin();
E>>std::advance( itData, Index );
E>>
S>а какая разница? временный объект будет жив до конца полного выражения, в котором он используется, так что ссылка на него будет валидной до выхода из advance
Здравствуйте, sadomovalex, Вы писали:
S>а какая разница? временный объект будет жив до конца полного выражения, в котором он используется, так что ссылка на него будет валидной до выхода из advance
Здравствуйте, ekamaloff, Вы писали:
E>Здравствуйте, sadomovalex, Вы писали:
E>>>
E>>>itData = vec1.begin();
E>>>std::advance( itData, Index );
E>>>
S>>а какая разница? временный объект будет жив до конца полного выражения, в котором он используется, так что ссылка на него будет валидной до выхода из advance
E>Тут дело немного в другом:
E>
Юзал advance и не задумывался, а почему он не возвращает ссылку на итератор, а вот ошибся, и задумался, рационального ответа так и не нашел, все только на уровне — "Исторически так сложилось".
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[7]: Получить итератор элемента vector по индексу ?
Здравствуйте, srggal, Вы писали:
S>Здравствуйте, sadomovalex, Вы писали:
S>Юзал advance и не задумывался, а почему он не возвращает ссылку на итератор, а вот ошибся, и задумался, рационального ответа так и не нашел, все только на уровне — "Исторически так сложилось".
наверное для того, чтобы не создавать дополнительных временных объектов
"Что не завершено, не сделано вовсе" Гаусс
Re[8]: Получить итератор элемента vector по индексу ?
Здравствуйте, srggal, Вы писали:
S>Здравствуйте, sadomovalex, Вы писали:
S>>наверное для того, чтобы не создавать дополнительных временных объектов
S>Я грил о возврате аргумента (по ссылке) первого аргумент.
т.е. просто добавить в advance return ?
"Что не завершено, не сделано вовсе" Гаусс
Re[10]: Получить итератор элемента vector по индексу ?
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 по индексу ?
Для меня это не рациональный ответ, ибо такая "забота" о пользователях итераторов никоим образом не согласуется с тем, что во многих случаях пользователь итераторов должен быть внимателен дабы не насиупить на грабли:
— *end();
— std::find( cont1.begin(), cont2.end() );
— etc.
Здравствуйте, 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 не хватает.
Я и имел в виду, что концептуально — итераторы не безопасты. И приведенный пример — не идет в разрез с концептуальной опасностью итераторов.