Почему я получил out_of_range? - PullRequest
       4

Почему я получил out_of_range?

0 голосов
/ 17 февраля 2020

Моя функция должна обратить значения вектора, но в одном случае я получил исключение out_of_range. Пожалуйста, объясните мне, в чем разница между этими случаями:

/// working version of my function
void Reverse(vector<int>& v)
{
    for (int i = 0; i < v.size() / 2; i++)
    {
        int temp = v[i];
        v[i] = v[v.size() - (i + 1)]; /// look at round brackets
        v[v.size() - (i + 1)] = temp; 
    }
}
/// wrong version
void Reverse2(vector<int>& v)
{
    for (int i = 0; i < v.size() / 2; i++)
    {

        int temp = v[i];
        v[i] = v[v.size() - i + 1];   /// this is wrong 
        v[v.size() - i + 1] = temp;   /// same
    }
}
/// 
int main()
{
    vector<int> v = { 10, 22, 13, 144, 55, 167, 999};
    Reverse(v);
    for (auto c : v)
    {
        cout << c << " ";
    }
}

Ответы [ 2 ]

2 голосов
/ 17 февраля 2020

v.size() - i + 1 для случаев, когда i = 0 совпадает с v.size() - 0 + 1 или v.size() + 1, что явно является ссылкой за пределы v.

Использование скобок даст вам v.size() - 1 или последний элемент вектора.

0 голосов
/ 17 февраля 2020

Без скобок, это слева направо оценки.

5 - 4 + 1 = 2, где 5 - (4 +1) = 0.

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