2015-06-14 3 views
0

Я написал следующий простой пример:Понимания итератора для станда :: вектор

#include<iostream> 
#include<vector> 

int main() 
{ 
    int arr[] = {1, 2, 4, 7, 10}; 
    std::vector<int> vect; 
    vect.assign(arr, arr + 5); 
    for(std::vector<int>::iterator it = vect.begin(); it != vect.end(); ++it) 
    { 
     std::cout << *it << std::endl; 
    } 

    std::cout << "-------------------------------------" << std::endl; 

    for(std::vector<int>::iterator it = vect.begin(); it != vect.end(); ++it) 
    { 
     std::cout << *it << std::endl; 
    } 
} 

DEMO

И оба две петли печатают же. Мой вопрос в том, насколько он надежный? Итерации по вектору возвращают элементы в одном порядке каждый раз? Я имею в виду, он стандартизирован или некоторые реализации разрешены для итерации по вектору в другом порядке. Например, мы перебирать вектора для firt времени следующим образом:

for(std::vector<int>::iterator it = vect.begin(); it != vect.end(); ++it) 
{ 
    std::cout << *it << std::endl; 
} 

и получить выход

1 
2 
4 
7 
10 

Хотя, итерация во второй раз произвести вывод:

2 
10 
1 
4 
7 

Возможно ли это для некоторой реализации?

+3

является ли он надежным ?: до тех пор, пока содержимое контейнера STL не изменится, вы получите тот же результат каждый раз, когда вы его итерации , Это гарантированное поведение. – 101010

+0

Нет, я так не думаю, что эти векторы будут внутренне реализованы как массивы или LinkedList - в основном массивы (изменяемые по размеру) и попытка сделать что-то, что меняется каждый раз, трудно реализовать. Если вы этого не хотите! :) В этом случае вы пишете свое! :) – gabhijit

+0

Является ли выход действительно другим? Я запустил ваш код на [CodeChef IDE] (http://www.codechef.com/ide), и результат такой же. – anshabhi

ответ

4

Да, это надежный.

Вектор представляет собой контейнер последовательности, что означает, что его порядок детерминирован. Вы выбираете порядок элементов в контейнере, и это тот порядок, из которого вы выходите, когда вы итерации. Всегда.

  • Вы заселить вектор с элементами, которые живут в индекс 0 в индекс N-1;
  • Итератор вектора итерации от индекс 0 до индекс N-1.

Это совершенно аналогично ходьбе вперед через массив, в этом смысле.

Как ни странно, даже ассоциативные контейнеры имеют надежный порядок итераций; даже если упорядочение элементов выполняется алгоритмом с использованием компаратора (который вы можете указать, а если нет, то это std::less), а не просто в силу порядка, в котором вы добавляли элементы.

Вы всегда можете рационализировать порядок итераций стандартного контейнера.

+0

. Интересно, может ли это ответить на языке, защищенном языком?) Спецификация функций вставки не очень формальна и, по-видимому, не связана с функциями доступа , – dyp

+0

@ dyp: Да, я решил не спускаться по этому маршруту, и я надеялся уйти с ним; p –

+0

Неупорядоченные ассоциативные контейнеры имеют надежный порядок итераций? –

3

std::vector Гарантированное непрерывное распределение памяти как массив. Таким образом, доступ к вектору, использующему итератор, всегда гарантируется в том же порядке элементов std::vector

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