Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Оператор [] в vector()


Автор: SaDFromSpb 3.6.2006, 08:46
Оператор [] для вектора по идее работает следующим образом: итератор приравнивается vector<T>::begin() и "проматывается" до указанного параметра. То есть в каждом витке цикла:
Код
for (int i=0; i<vec.size(); i++)
   // делаем что-нибудь с vec[i]
Вектор проходится сначала до элемента i. Следовательно в таких случаях лучше проходить вектор через итератор. Или же все-таки оператор [] на всякий случай запоминает текущее положение в векторе? (По-моему должен) 

Автор: MAKCim 3.6.2006, 09:00
насколько я знаю в векторе элементы находятся непрерывно в памяти
значит зная адрес начала буфера можно одним махом получить доступ к i-му элементу
Код

*(buffer+i);

вот в list как раз по этой причине и нет operator[] (элементы разбросаны по всему вдресному пространству) 

Автор: SaDFromSpb 3.6.2006, 09:24
MAKCim, очень похоже на правду! Я что-то про это не подумал. Да и в справочнике написано, что если i больше размера массива, то результат не определен. Следовательно он наверняка через *(buffer+i) работает. 

Автор: UnrealMan 3.6.2006, 11:33
Цитата
MAKCim, очень похоже на правду!

Истинная правда :-) Есть ещё метод at, который осуществляет проверку индекса. 

Автор: ZeusAtVingrad 3.6.2006, 11:37
А в исходник шаблона не посмотреть что-ли?
Это ж не либа какая - он доступен для просмотра. 

Автор: DeadSoul 3.6.2006, 11:47
SaDFromSpb, а std::for_each тебе не подойдет?
Цитата(SaDFromSpb @  3.6.2006,  08:46 Найти цитируемый пост)
 "проматывается" до указанного параметра

или std::find\std::find_if 

Автор: SaDFromSpb 3.6.2006, 15:28
DeadSoul, ну для for_each еще функтор (или функцию) свой писать. Не.. В моем случае очень удобно использовать семанткиу обычных массивов особенно когда вектор векторов.
 

Автор: DeadSoul 3.6.2006, 22:35
SaDFromSpb, а ты уверен, что писать придется? boost::bind или boost::lambda.... 

Автор: Earnest 5.6.2006, 11:03
DeadSoul, не в этом ведь суть вопроса.
SaDFromSpb, vector::operator[] совершенно точно работает как *(buffer+i), это требование стандарта - непрерывное расположение в памяти и постоянная сложность.
И как правильно заметил ZeusAtVingrad, в исходники полезно иногда заглядывать.  

Автор: DeadSoul 5.6.2006, 21:24
Цитата(Earnest @  5.6.2006,  11:03 Найти цитируемый пост)
DeadSoul, не в этом ведь суть вопроса.


Earnest, знаю. Но к хорошему стилю приучать стоитsmile 

Автор: SaDFromSpb 5.6.2006, 22:09
DeadSoul, У меня начинает складываться впечатление (далеко не только из-за этого треда), что если в проекте не используется boost, то это уже ламерство.  smile  

Автор: Royan 5.6.2006, 22:24
А заодно посмотрите, как реализован std::vector<bool>, чтобы быть в курсе ;) и чтобы код был универсальным не стоит придумывать форму колеса. 

Автор: DeadSoul 5.6.2006, 22:46
Цитата(SaDFromSpb @  5.6.2006,  22:09 Найти цитируемый пост)
DeadSoul, У меня начинает складываться впечатление (далеко не только из-за этого треда), что если в проекте не используется boost, то это уже ламерство.     


SaDFromSpb, дело в том, что STL уже не является "тайным знанием гуру С++".  В ту же сторону движется и boost


Цитата(Royan @  5.6.2006,  22:24 Найти цитируемый пост)
А заодно посмотрите, как реализован std::vector<bool>, чтобы быть в курсе ;) 

vector<bool> не является контейнером stl
 

Автор: Earnest 6.6.2006, 13:01
Цитата(SaDFromSpb @  5.6.2006,  23:09 Найти цитируемый пост)
DeadSoul, У меня начинает складываться впечатление (далеко не только из-за этого треда), что если в проекте не используется boost, то это уже ламерство.  

Ламерство или не ламерство, но кто попробовал boost (или аналог), соскочить уже не сможет...
Кстати, многие из компонент boost войдут в следующий стандарт C++, о чем в этом форуме уже говорилось. 
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)