И надо вернуть индекс (порядковый номер), например где Y == 10.
— перебирать от begin() до end() не охото!
— find вернёт итератор.
Posted via RSDN NNTP Server 2.1 beta
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Здравствуйте, Smooky, Вы писали:
S>Подскажите плиз! S>Например:
S>struct X { S> int Y; S> char c[128]; S>}
S>std::vector<X> x;
S>И надо вернуть индекс (порядковый номер), например где Y == 10.
S>- перебирать от begin() до end() не охото! S>- find вернёт итератор.
std::vector<X>::const_iterator it = std::find_if( x.begin(), x.end(), pred );
size_t idx = std::distance( x.begin(), it );
Здравствуйте, Smooky, Вы писали:
S>И надо вернуть индекс (порядковый номер), например где Y == 10.
S>- перебирать от begin() до end() не охото!
А придётся! Либо отсортировать данные.
Либо использовать дополнительный std::map или вместо std::vector — boost::multi_index, если тебе нужно сохранить естественный порядок элементов, а не только сортированный.
S>- find вернёт итератор.
Дистанция между begin'ом и ним и равна индексу. У вектора вычисление дистанции мгновенное, у дека и списка — линейное.
ptrdiff_t index = std::distance(vec.begin(), std::find(vec.begin(), vec.end()));
// если index == vec.size(), то элемент не найден
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[2]: Оптимально найти в векторе
От:
Аноним
Дата:
21.08.07 11:31
Оценка:
Здравствуйте, Кодт, Вы писали:
К>Дистанция между begin'ом и ним и равна индексу. У вектора вычисление дистанции мгновенное, у дека и списка — линейное.
Разве у дека не random access iterator?!
Здравствуйте, <Аноним>, Вы писали:
К>>Дистанция между begin'ом и ним и равна индексу. У вектора вычисление дистанции мгновенное, у дека и списка — линейное. А>Разве у дека не random access iterator?!
random access, но время линейное. (С константой, много меньшей единицы).
Дек устроен как вектор массивов либо список массивов. Если оба итератора указывают на элементы из одного массива — то O(1), разница указателей. А если нет — то придётся побегать.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[4]: Оптимально найти в векторе
От:
Аноним
Дата:
21.08.07 12:59
Оценка:
Здравствуйте, Кодт, Вы писали:
К>>>Дистанция между begin'ом и ним и равна индексу. У вектора вычисление дистанции мгновенное, у дека и списка — линейное. А>>Разве у дека не random access iterator?! К>random access, но время линейное. (С константой, много меньшей единицы). К>Дек устроен как вектор массивов либо список массивов. Если оба итератора указывают на элементы из одного массива — то O(1), разница указателей. А если нет — то придётся побегать.
Я всегда считал, что для random access iterator-a операция итератор+целое число должна занимать О(1)
Сколько она занимает для дека(я не дурак, я просто с деком не работал )?
Здравствуйте, <Аноним>, Вы писали:
А>Я всегда считал, что для random access iterator-a операция итератор+целое число должна занимать О(1) А>Сколько она занимает для дека(я не дурак, я просто с деком не работал )?
Нда, я всё-таки ошибся.
24.1/1 утверждает, что функции над итераторами, перечисленные в соответствующих таблицах, имеют амортизированную временную сложность O(1).
Сейчас смотрел на реализацию дека от Dinkumware (в комплекте VC8) — там инкремент бесплатный (каждому итератору соответствует целое число), зато разыменование многоступенчатое.