2011-12-16 2 views

ответ

3

Вы также можете просто сделать:

std::string::const_iterator it = s.begin() + (id-1); 

хотя он должен иметь более или менее такой же производительности std::advance, так как, если it является случайным итератор доступа, advance использует operator+ (в противном случае он прибегает к циклу, это происходит, например, для итераторов list).

+0

Я забыл станд :: строка распределения смежна ... Граци! –

+2

@PietroM: он не имеет никакого отношения к тому, является ли распределение строк строгим, оно имеет отношение к типу итератора. 'deque' не имеет смежного распределения, но он имеет итераторы с произвольным доступом, поэтому его итераторы имеют' operator + '. –

+1

@PietroM: prego, ma effettivamente è Come Dice Steve Jessop. :) Тот факт, что строки гарантируют непрерывное распределение памяти, вместо этого позволяет вам перемещаться внутри строки с помощью указателей (полученных, например, с помощью '& (s [0])'). –

4

С std::string итераторы «s являются произвольным доступом, вы можете сразу это сделать:

std::string::const_iterator it = s.begin() + (id-1); 

(Это то, что в конечном итоге std::advance расширяется для случайных итераторы доступа.)

Смежные вопросы