Возможно ли, что vector :: size () возвращает неправильное значение? - PullRequest
0 голосов
/ 21 февраля 2019

В классе программирования на С ++ мы выполнили упражнение, и для обстоятельств я решил использовать функцию «размер» в std :: vector для диапазона вместо итератора.Затем мой учитель сказал мне, что «иногда» размер функции может возвращать НЕПРАВИЛЬНОЕ значение, поэтому цикл for может выходить за пределы диапазона или быть недостаточным.

Я пишу на С ++ почти 2 года на 4 разных компиляторах, и я не уверен, что это правда.

Может ли функция size () вектора возвращать неправильное значение?

РЕДАКТИРОВАТЬ: я согласен, что этот вопрос не нуждается в коде, потому что это теоретический случай, но я проиллюстрируюВы с короткой версией:

#include <iostream>
#include <vector>

using namespace std;

typedef vector<uint64_t> telephone_nums;

int main(int argc, const char * argv[]) {
    vector<telephone_nums> telephone_mat;

    // adding elements to telephone_mat

    for (size_t x = 0; x < telephone_mat.size(); ++x){
        for (size_t y = 0, len = telephone_mat[x].size(); y < len; ++y){
            //modification in the matriz...
        }
    }

    return 0;
}

1 Ответ

0 голосов
/ 21 февраля 2019

Может ли функция size () вектора возвращать неправильное значение?

Конечно.Он может вернуть «неправильное» значение, когда «правильное» значение, которое вам нужно, не соответствует размеру вектора.

, что мой учитель сказал мне, что «size ()» «никогда не должениспользовать без контекста "

Это довольно глупое преувеличение.

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

Типичный пример того, как новичок неосознанно пишет программу с неопределенным поведением, даже если программавыглядит правильно в глазах новичка:

for (size_t x = 1; x <= telephone_mat.size(); ++x)

Другая типичная ошибка новичка:

for (size_t i = 0; i < vec.size(); ++i)
    if (condition)
        vec.erase(vec.begin() + i);

Пример потенциально более простого способа написания ваших циклов (хотя то, применимо ли это, зависит откак изменяются векторы):

for (auto& nums : telephone_mat){
    for (auto& element : nums){
        //modification in the matriz...
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...