c++ - 在循环内构造向量并将其返回到该范围之外的安全方法?
问题描述
我有一个代码示例,我想请您检查一下并告诉我我的理解是否正确。我正在学习 C++,所以如果这些问题是初级的,我深表歉意。我已经阅读了 C++ 如何处理内存管理,但我还没有找到实际的例子。我正在尝试自己写一些。
代码示例:
std::vector<std::vector<int32_t>> containerOfVectors;
for (int i = 0; i < 2; i++) {
std::vector<int32_t> innerVector;
innerVector.push_back(1);
containerOfVectors.push_back(move(innerVector));
innerVector.push_back(2);
innerVector.push_back(3);
innerVector.push_back(4);
std::cout << "innerVector " << std::to_string(i) << " contains: " << std::endl;
for (int k = 0; k < innerVector.size(); k++) {
std::cout << "\t" << std::to_string(innerVector[k]) << std::endl;
}
}
for (int i = 0; i < 2; i++) {
std::vector<int32_t> vector = containerOfVectors[i];
std::cout << "Vector " << std::to_string(i) << " contains " << std::to_string(vector.size()) << " element(s)" << std::endl;
}
----------
Output:
----------
innerVector 0 contains:
2
3
4
innerVector 1 contains:
2
3
4
Vector 0 contains 1 element(s)
Vector 1 contains 1 element(s)
我有一个向量的(容器)向量,我正在循环并在循环内创建两个向量,它们被添加到containerOfVectors
. 我将一个元素添加到循环内的向量中,将其移动到containerOfVectors
,然后添加三个其他元素。
在第二个循环中,当我迭代containerOfVectors
并打印出值时,我只看到1
. 值2
、3
和4
不存在。
我对此的理解是move
调用正在将元素复制innerVector
到一个新的向量中,并且此时innerVector
变为空。因此,在循环迭代结束时,innerVector
将仅包含 2、3 和 4,因为仅移动了 1。然后innerVector
被摧毁。
该移动实际上是“复制”,还是“移动”相同的“2”?如果值是结构而不是整数,它(或如何)会有所不同吗?我怎样才能自己测试呢?通过打印内存地址,还是同一底层实例的内存地址可以不同?
我很抱歉这里有很多东西要解压。非常感谢任何指导。
解决方案
移动语义创建新对象。它不是副本或赋值,而是调用的移动构造函数。因此,如果您调用move(innerVector)
您实际上是在 containerOfVectors 中创建一个新的矢量对象作为条目。innerVector
这会在您拨打电话时自动包含原始内容/数据。之后,innerVector 是空的,无论你用它做什么都不会影响 containerOfVectors 中的新对象。这两个不同的对象之间没有联系。使用移动构造创建的对象的内存地址肯定总是与其原始对象不同。
这完全解释了您的示例的输出。对于向量中的任何其他数据类型,也包括结构,这将是相同的。
推荐阅读
- delegates - 自定义委托过滤器 VC Swift5
- html - 仅在超过一定长度时显示 div
- gnuplot - 指数函数 - 绘制最小值
- flutter - 如何在颤动中检查和删除所有现有的 sqflite 数据库?
- java - 如何给每个云一个单独的 x 位置,以便我可以根据它绘制它
- flutter - 如何在 Flutter 中创建带有边框阴影的矩形?
- json - 如何在熊猫中连接或合并具有不同列数的三个表?
- c - 使用 sprintf 时大小为 1 的 char 数组的空终止
- c++ - 二叉树级顺序插入c ++
- python - 找到最小的 n 使得第 n 个 Bernstein 近似是好的,误差最多为 10^(-8)