Home > Software engineering >  Getting random numbers on vector operation c
Getting random numbers on vector operation c

Time:06-30

I'm getting weird numbers as output in this code :

#include <iostream> 
#include <vector> 

int main(){

    std::vector<std::vector<int>> vec = {{0,1},{2,3}};
    
    vec.push_back({4,5});
    vec.push_back({5,6});

    for (int i = 0; i < vec.size(); i  ){
        for (int i2 = 0; i2 < vec.size(); i2  ){
            std::cout << vec[i][i2] << std::endl; 
        }
    }


    return 0;
}

It's returning to me:

0
1
1280136264
0
2
3
347673833
38962
4
5
297276653
134256690
5
6
280499436
268474418

I just want to know how to do it properly, and why I'm getting these numbers.

CodePudding user response:

The output you are seeing is due to undefined behavior in your code.

The outer vector object has 4 inner vector<int> objects added to it. Each of those inner vector<int> objects is holding 2 int values.

Your inner for loop is going out of bounds of the inner vector<int> objects, by trying to access 4 int values when there are only 2 int values available.

In your inner for loop, you need to change vec.size() to vec[i].size() instead, eg:

#include <iostream> 
#include <vector> 

int main(){

    std::vector<std::vector<int>> vec = {{0,1},{2,3}};
    
    vec.push_back({4,5});
    vec.push_back({5,6});

    for (size_t i = 0; i < vec.size();   i){
        for (size_t i2 = 0; i2 < vec[i].size();   i2){
            std::cout << vec[i][i2] << std::endl; 
        }
        /* alternatively:
        auto &vec2 = vec[i];
        for (size_t i2 = 0; i2 < vec2.size();   i2){
            std::cout << vec2[i2] << std::endl; 
        }
        */
    }

    return 0;
}

Online Demo

That being said, a safer way to code this is to use range-for loops instead, eg:

#include <iostream> 
#include <vector> 

int main(){

    std::vector<std::vector<int>> vec = {{0,1},{2,3}};
    
    vec.push_back({4,5});
    vec.push_back({5,6});

    for (auto &vec2 : vec){
        for (auto value : vec2){
            std::cout << value << std::endl; 
        }
    }

    return 0;
}

Online Demo

  • Related