| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Оператор [] в vector() |
| Автор: SaDFromSpb 3.6.2006, 08:46 | ||
Оператор [] для вектора по идее работает следующим образом: итератор приравнивается vector<T>::begin() и "проматывается" до указанного параметра. То есть в каждом витке цикла:
|
| Автор: MAKCim 3.6.2006, 09:00 | ||
| насколько я знаю в векторе элементы находятся непрерывно в памяти значит зная адрес начала буфера можно одним махом получить доступ к i-му элементу
вот в list как раз по этой причине и нет operator[] (элементы разбросаны по всему вдресному пространству) |
| Автор: SaDFromSpb 3.6.2006, 09:24 |
| MAKCim, очень похоже на правду! Я что-то про это не подумал. Да и в справочнике написано, что если i больше размера массива, то результат не определен. Следовательно он наверняка через *(buffer+i) работает. |
| Автор: UnrealMan 3.6.2006, 11:33 | ||
Истинная правда :-) Есть ещё метод at, который осуществляет проверку индекса. |
| Автор: ZeusAtVingrad 3.6.2006, 11:37 |
| А в исходник шаблона не посмотреть что-ли? Это ж не либа какая - он доступен для просмотра. |
| Автор: DeadSoul 3.6.2006, 11:47 |
| SaDFromSpb, а std::for_each тебе не подойдет? или 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, знаю. Но к хорошему стилю приучать стоит |
| Автор: SaDFromSpb 5.6.2006, 22:09 |
| DeadSoul, У меня начинает складываться впечатление (далеко не только из-за этого треда), что если в проекте не используется boost, то это уже ламерство. |
| Автор: Royan 5.6.2006, 22:24 |
| А заодно посмотрите, как реализован std::vector<bool>, чтобы быть в курсе ;) и чтобы код был универсальным не стоит придумывать форму колеса. |
| Автор: Earnest 6.6.2006, 13:01 | ||
Ламерство или не ламерство, но кто попробовал boost (или аналог), соскочить уже не сможет... Кстати, многие из компонент boost войдут в следующий стандарт C++, о чем в этом форуме уже говорилось. |