2014-01-29 2 views
0

Для вектора можно использовать как итератор и указатель для доступа к элементам и перебирать их, например:C++ итераторы против указателя для вектора доступа

std::vector<int> x {0, 1, 2}; 
std::vector<int>::iterator it = x.begin(); 
int *begin = &x[0]; 

Оба итератора и указатель даст доступ к одному и тому же объекту. Однако, насколько мне известно, предпочтительным способом является использование итераторов (для любых контейнеров, кроме массивов). Есть ли для этого конкретная причина? (За исключением того факта, что при моем создании я предполагаю, что контейнер имеет определенную операцию [].)

+0

Попробуйте указатель с 'std :: list'. – chris

+0

Это потому, что std :: list не предоставляет оператора индексирования. Разве это единственная причина? Но тогда std :: list должен предоставить операцию .begin(), что не намного сложнее, чем запись операции [], так почему это так предпочтительнее? – JamesLens

+0

К сожалению, я тоже прочитал эту часть сообщения. Притворись, что я сказал «std :: deque». Во всяком случае, указатели глупы. Итераторы ожидали семантики для всех контейнеров, независимо от того, что они должны делать, чтобы проходить через нее. Он даже не должен быть контейнером. – chris

ответ

0

Используйте итераторы, если у вас нет конкретной причины. Несколько важных операций (например, insert, erase и т. Д.) Требуют итераторов, поэтому вам часто придется кашлять в любом случае. Итераторы также отлично работают с алгоритмами для выполнения сложных задач, которые сложны для явных циклов. Кроме того, они достаточно универсальны для работы на всех контейнерах, а не только vector и string.

Конечно, если вы находитесь в ситуации, в которой требуется указатель (например, взаимодействующий с C API или взаимодействующий с границей модуля), вы не должны чувствовать себя «грязным» в этом отношении - указатели в порядке , Просто используйте их там, где это необходимо.

И, наконец, в конкретном случае вектора и строки обязательно учитывайте индексы. Некоторые алгоритмы более читабельны, используя их, и они имеют то преимущество, что они никогда не становятся недействительными, если вектор вынужден перераспределять или что-то в этом роде. (Обратите внимание, что это блокирует вас в вектор или строку и может затруднить смену контейнеров)

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