C ++ Cout внутри l oop для печати вектора векторов не удается - PullRequest
2 голосов
/ 10 апреля 2020
template<typename s>
void vecprint2d(const s& vec){
    cout<<"{"<<endl;
    for(int x = 0; x < vec.size(); x++){
        cout<<"{";
        for(int y = 0; y < vec[x].size() - 1;y++){
            cout << vec[x][y]<<", ";
        }
        cout<<vec[x][vec[x].size() - 1]<<"}"<<endl;
    }
    cout<<"}"<<endl;
}


int main(){
vector<vector<int>> vec = {{1,2,3},{},{4,5,6}};
vecprint2d(vec);
return 0;
}

в моей попытке использовать функцию для печати вектора векторов, почему cout внутри внутреннего l oop вызывает проблемы или проблема в другом месте?

вывод сейчас выглядит так :

{

{

Ответы [ 2 ]

3 голосов
/ 10 апреля 2020

Если внутренний вектор size равен 0, size() - 1 переполнится и будет l oop навсегда и / или cra sh. Может ли это быть тем, что происходит на вашем Raspberry Pi?

Чтобы избежать этого, обрабатывайте также 0 -размерные векторы.

Например, вот так:

template<typename s>
void vecprint2d(const s& vec) {
    cout << "{" << endl;
    for (auto const& row : vec) {
        cout << "{";
        int i = 0;
        for (auto const& val : row) {
            if (i++)
                cout << ", ";
            cout << val;
        }
        cout << "}" << endl;
    }
    cout << "}" << endl;
}
0 голосов
/ 10 апреля 2020

Функция size() пустого вектора вернет (без знака) значение ноль , и в вашем внутреннем l oop вы протестируете y против vec[x].size() - 1. Это даст значение, которое «недополучено» и, следовательно, будет иметь значение максимум , которое может содержать переменная size_t, поэтому y l oop будет выполняться очень большое количество раз! Тем не менее, он, скорее всего, потерпит неудачу на первом l oop, потому что попытка получить доступ к любому элементу пустого vector означает неопределенное поведение .

Чтобы это исправить, заключите свой внутренний l oop в блок if "is is empty" (фактически, вы должны сделать это для обоих циклов). Вот возможное решение:

template<typename s>
void vecprint2d(const s& vec)
{
    cout << "{" << endl;;
    if (!vec.empty()) for (size_t x = 0; x < vec.size(); x++) {
        cout << "{";
        if (!vec[x].empty()) {
            for (size_t y = 0; y < vec[x].size() - 1; y++) {
                cout << vec[x][y] << ", ";
            }
            cout << vec[x][vec[x].size() - 1];
        }
        cout << "}" << endl;
    }
    cout << "}" << endl;
}

Не стесняйтесь просить дальнейших разъяснений и / или объяснений.

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