Итерация по std :: vector: unsigned vs знаковая переменная со знаком - PullRequest
435 голосов
/ 03 января 2009

Как правильно перебирать вектор в C ++?

Рассмотрим эти два фрагмента кода, этот работает нормально:

for (unsigned i=0; i < polygon.size(); i++) {
    sum += polygon[i];
}

и вот этот:

for (int i=0; i < polygon.size(); i++) {
    sum += polygon[i];
}

, который генерирует warning: comparison between signed and unsigned integer expressions.

Я новичок в мире C ++, поэтому переменная unsigned кажется мне несколько пугающей, и я знаю, что unsigned переменные могут быть опасны, если не используются правильно, поэтому - это правильно?

Ответы [ 16 ]

4 голосов
/ 03 января 2009
for (vector<int>::iterator it = polygon.begin(); it != polygon.end(); it++)
    sum += *it; 
2 голосов
/ 19 октября 2017

Подумайте, нужно ли вообще повторять

Стандартный заголовок <algorithm> предоставляет нам следующие возможности:

using std::begin;  // allows argument-dependent lookup even
using std::end;    // if the container type is unknown here
auto sum = std::accumulate(begin(polygon), end(polygon), 0);

Другие функции в библиотеке алгоритмов выполняют общие задачи - убедитесь, что вы знаете, что доступно, если хотите сэкономить силы.

2 голосов
/ 03 января 2009

Первый тип правильный и правильный в некотором строгом смысле. (Если вы думаете о том, что размер не может быть меньше нуля.) Однако это предупреждение кажется мне одним из хороших кандидатов на игнорирование.

1 голос
/ 31 января 2018

Неясная, но важная деталь: если вы скажете «for (auto it)» следующим образом, вы получите копию объекта, а не фактический элемент:

struct Xs{int i} x;
x.i = 0;
vector <Xs> v;
v.push_back(x);
for(auto it : v)
    it.i = 1;         // doesn't change the element v[0]

Чтобы изменить элементы вектора, вам нужно определить итератор как ссылку:

for(auto &it : v)
0 голосов
/ 29 мая 2018

Два сегмента кода работают одинаково. Тем не менее, unsigned int "маршрут верен. Использование типов unsigned int будет лучше работать с вектором в экземпляре, в котором вы его использовали. Вызов функции-члена size () для вектора возвращает целочисленное значение без знака, поэтому вы хотите сравнить переменную «я» к значению своего собственного типа.

Кроме того, если вы все еще немного обеспокоены тем, как "unsigned int" выглядит в вашем коде, попробуйте "uint". Это в основном сокращенная версия «unsigned int», и она работает точно так же. Вам также не нужно включать другие заголовки, чтобы использовать его.

0 голосов
/ 25 марта 2018

Если ваш компилятор поддерживает это, вы можете использовать диапазон для доступа к элементам вектора:

vector<float> vertices{ 1.0, 2.0, 3.0 };

for(float vertex: vertices){
    std::cout << vertex << " ";
}

Отпечатки: 1 2 3. Обратите внимание, что вы не можете использовать эту технику для изменения элементов вектора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...