For-Loop a «Пустой» вектор с отрицательным итератором? - PullRequest
1 голос
/ 28 марта 2019

Я пытаюсь перебрать последние 10 записей вектора.Размер вектора может быть любым от 0 до 100.

Как самое простое решение, хотя я начинаю цикл в vector.size () - 10;и затем проверьте внутри, если он не отрицательный, я могу получить доступ к объекту вектора.

К сожалению, он не работает (вообще не зацикливается), но если я заменяю тот же код на жестко закодированные числа, он работает.

Что я делаю неправильно, или в чем здесь проблема?

for (int i = -10; i < 0; i++) {
    std::cout << "Normal Loop: i = " << i << std::endl;
}

Это работает, но цикл по вектору не работает:

std::vector<int> myVector;
for (int i = myVector.size() - 10; i < myVector.size(); i++) {
    std::cout << "Vector Loop: i = " << i << std::endl;
}

Первый цикл печатаетвсе 10 чисел (от -10 до -1), но второй цикл ничего не печатает.

Поскольку myVector.size () прямо сейчас равен 0, он должен быть таким же, как и первый

1 Ответ

1 голос
/ 28 марта 2019

Это потому, что std::vector::size() возвращает size_type как тип, этот тип без знака. Это означает, что i < myVector.size() сравнивает два разных типа, int и unsigned int. Компилятор будет "продвигать" ваш int к типу без знака. Поскольку этот тип int отрицателен, а беззнаковые типы не могут содержать отрицательные значения, он обернется, и вы получите очень большое значение, и, следовательно, условие цикла никогда не будет выполнено.

Вы можете разыграть size() явно:

std::vector<int> myVector;
for (int i = myVector.size() - 10; i < static_cast<int>(myVector.size()); i++) {
    std::cout << "Vector Loop: i = " << i << std::endl;
}

Или для более чистого подхода попробуйте использовать rbegin() и делать цикл до rend() или пока вы не зациклились 10 раз, что-то вроде:

std::vector<int> myVector;
//fill vector..
auto itr = myVector.rbegin();
int count = 10;
while(itr != myVector.rend() && count-- > 0)
{
  //process.
  ++itr;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...