Можно ли использовать вложенный итератор, как показано ниже?
for (vector<type>::iterator i = list.begin(); i != list.end(); ++i) {
for (vector<type>::iterator j = i; j != list.end(); ++j) {
...
}
}
Обратите внимание, что j
начинается в i
, и не list.begin()
, Поскольку итератор является произвольным доступом, могу ли я гарантировать, что оба i
а также j
будет иметь такой же порядок? Есть ли лучший способ сделать это?
Ваш код правильный.
Оба итератора будут иметь одинаковый порядок и приращение j
не влияет i
до тех пор, пока вы не сделаете какую-либо операцию, которая делает недействительными итераторы (например, стирание или нажатие на вектор).
Это абсолютно нормально, если вы ничего не делаете внутри циклы, которые могут сделать недействительными итераторы.
(Как в сторону, list
сомнительное имя для std::vector
по-моему.)
Это прекрасно. Случайный доступ не означает случайный порядок. Это означает, что вы можете перепрыгнуть через контейнер, используя аддитивные операторы (+
а также -
) на вашем итераторе. Например, с итератором произвольного доступа it
, ты можешь сделать it + 10
, Для итератора без произвольного доступа, вы должны сделать it++
10 раз для достижения того же эффекта. ( std::advance
Функция будет инкапсулировать это для вас, хотя)
Это должно работать нормально. Vector хранит элементы по порядку, и оба итератора будут подчиняться этому порядку.