C ++ вложенные итераторы

Можно ли использовать вложенный итератор, как показано ниже?

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 будет иметь такой же порядок? Есть ли лучший способ сделать это?

2

Решение

Ваш код правильный.

Оба итератора будут иметь одинаковый порядок и приращение j не влияет i до тех пор, пока вы не сделаете какую-либо операцию, которая делает недействительными итераторы (например, стирание или нажатие на вектор).

4

Другие решения

Это абсолютно нормально, если вы ничего не делаете внутри циклы, которые могут сделать недействительными итераторы.

(Как в сторону, list сомнительное имя для std::vector по-моему.)

3

Это прекрасно. Случайный доступ не означает случайный порядок. Это означает, что вы можете перепрыгнуть через контейнер, используя аддитивные операторы (+ а также -) на вашем итераторе. Например, с итератором произвольного доступа it, ты можешь сделать it + 10, Для итератора без произвольного доступа, вы должны сделать it++ 10 раз для достижения того же эффекта. ( std::advance Функция будет инкапсулировать это для вас, хотя)

3

Это должно работать нормально. Vector хранит элементы по порядку, и оба итератора будут подчиняться этому порядку.

1
По вопросам рекламы [email protected]