Оптимально найти в векторе
От: Smooky Россия  
Дата: 21.08.07 10:31
Оценка: :)
Подскажите плиз!
Например:

struct X {
int Y;
char c[128];
}

std::vector<X> x;

И надо вернуть индекс (порядковый номер), например где Y == 10.

— перебирать от begin() до end() не охото!
— find вернёт итератор.
Posted via RSDN NNTP Server 2.1 beta
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Re: Оптимально найти в векторе
От: Smal Россия  
Дата: 21.08.07 10:46
Оценка:
Здравствуйте, 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 );
С уважением, Александр
Re: Оптимально найти в векторе
От: Кодт Россия  
Дата: 21.08.07 11:06
Оценка: 1 (1)
Здравствуйте, 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?!
Re: Оптимально найти в векторе
От: remark Россия http://www.1024cores.net/
Дата: 21.08.07 11:32
Оценка:
Здравствуйте, Smooky, Вы писали:

S>- find вернёт итератор.


std::vector<int> v;
std::vector<int>::iterator i = std::find(v.begin(), v.end(), 0);
if (v.end() == i) return;
size_t index = i - v.begin();



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[3]: Оптимально найти в векторе
От: Кодт Россия  
Дата: 21.08.07 12:03
Оценка:
Здравствуйте, <Аноним>, Вы писали:

К>>Дистанция между 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)
Сколько она занимает для дека(я не дурак, я просто с деком не работал )?
Re[5]: Оптимально найти в векторе
От: Кодт Россия  
Дата: 21.08.07 14:49
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Я всегда считал, что для random access iterator-a операция итератор+целое число должна занимать О(1)

А>Сколько она занимает для дека(я не дурак, я просто с деком не работал )?

Нда, я всё-таки ошибся.
24.1/1 утверждает, что функции над итераторами, перечисленные в соответствующих таблицах, имеют амортизированную временную сложность O(1).

Сейчас смотрел на реализацию дека от Dinkumware (в комплекте VC8) — там инкремент бесплатный (каждому итератору соответствует целое число), зато разыменование многоступенчатое.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.