C++初始化全零n*n二维vector的正确方式 为何size返回值不是n*n
问题解答
1. 现有写法的正确性说明
你的初始化写法是完全正确的,已经实现了n行n列所有元素为0的二维数组:
vector<int>(n)会创建一个长度为n、所有元素默认初始化为0的一维int数组- 外层
vector<vector<int> > ans(n, vector<int>(n))就是把上述一维数组复制n份,作为外层vector的n个元素,最终得到n*n的全0二维数组
你遇到的ans.size()返回n是正常现象:ans本身是存储「一维vector」的容器,size()返回的是外层容器的元素个数(也就是二维数组的行数)。如果要获取总元素个数,需要计算ans.size() * ans[0].size(),对应你测试代码里n=3的场景,总元素数就是3*3=9。
2. 更优的实现方式
可以根据你的使用场景选择合适的方案:
方案1:保留嵌套vector,优化可读性
如果不需要极致性能,只是想让代码逻辑更清晰,避免有人不清楚int默认初始化值为0,可以明确指定初始值:
vector<vector<int> > ans(n, vector<int>(n, 0));
和你原有写法效果完全一致,仅可读性更高。如果编译器支持C++11及以上版本,还可以省略嵌套vector之间的空格,写法更简洁:
vector<vector<int>> ans(n, vector<int>(n, 0));
方案2:一维vector模拟二维数组(性能更优)
嵌套vector的每行内存是分散存储的,缓存命中率低,高频访问场景下性能较差。可以用一维连续内存模拟二维数组,访问效率更高,也能直接拿到你预期的n*n总大小返回值:
int n = 3; // 初始化大小为n*n的全0数组 vector<int> ans(n * n, 0); // 访问第i行第j列的元素(i、j从0开始计数) int val = ans[i * n + j]; // 修改元素 ans[i * n + j] = 10; // 直接调用ans.size()即可得到总元素数,返回值为n*n cout << "总元素数:" << ans.size() << endl;
内容的提问来源于stack exchange,提问作者Amith Kotian
相关产品推荐
相关产品推荐

