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;
}
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;
}