2010-06-21 4 views
1

занимают постоянное время, чтобы переместить итератор к элементам строки в следующем:перебор станд :: строковые элементы

std::string str // string of size 100 MB 
std::string::iterator iter = str.begin(); 
std::advance(iter, str.size()-1); 

это займет постоянное время как в поиске по индексу?

char c = str[str.size()-1]; 
+1

Используйте строку :: iterator, только если вы действительно хотите мутировать. Он запускает копирование при записи, что приводит к запутыванию результатов профилирования. – pmr

ответ

3

Да, это правильно. Это гарантируется стандартом С ++ (§24.3, операции итераторов):

Так как только случайные итераторы доступа обеспечивают + и - операторы, библиотека предоставляет два шаблона функции заранее и расстояния. Эти функции шаблоны используют + и - для случайных итераторов доступа (и, следовательно, постоянное время для них);

0

Почему бы вам не использовать верхний код вместо str.end() - 1?

Редактировать: Или str.back(), который является гораздо более контейнерным.

+0

Больше комментариев. :) – GManNickG

+0

Он не полагается на то, что он является итератором произвольного доступа. В конкретном случае это не важно, но может, если оно слишком упрощено. – pmr