Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Getting random numbers on vector operation c++

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.

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

>Solution :

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

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading