返回元组 c++ 的向量
Returning a vector of tuples c++
我正在尝试创建并返回两个元素数组的向量(我将称为元组(,但是我遇到了问题。
std::vector<int *> distr;
int tuple[2];
distr.push_back(tuple);
//modify tuple's contents
distr.push_back(tuple)
在这种情况下,distr 具有修改后的元组的两个副本,而不是我想要的两个不同的元组。
所以我认为这与内存有关,所以我尝试了这种方法
distr.push_back(new int [num1, num2]);
但它不能正确保存元组,因为尝试访问它们的值会返回奇怪的错误值。
这显然是由于对内存分配方式的误解。我可以理解为什么第一个示例以这种方式失败,但我不理解第二个示例的问题。
当您使用
distr.push_back(new int [num1, num2]);
您不是在创建一个填充 num1、num1 的双元素数组。这将像下面这样完成:
new int[2] {num1, num2}
不过,我建议不要使用此方法。 如果你所有的元组都是相同的大小,我会制作结构来表示该数据类型(在两个元组的特殊情况下,你甚至可以使用 std::pair
(
使用一对而不是指针:
std::vector<std::pair<int, int> > distr;
// Do some code
distr.emplace_back(num1, num2);
首先,您应该了解,"经典"C 和 C++ 数组只是已分配内存的缓冲区。在示例中,tuple
只是一个指向分配的 2 个整数缓冲区的指针。因此,当您push_back值tuple
时,您只需添加相同的指针两次。数组本身不会复制到 std::vector,因此,以包含两个指向 SAME 内存区域的指针的 vector 结尾。若要实现所需的行为,可以使用更高级的C++数据类型,例如 std::tuple 或 std::array。
说到你的第二个代码片段,这只是语法上的误解:表达式new <type>[<count>]
创建一个内存缓冲区(类似于你的tuple
,但在堆上(的类型为 <type>
的值。因此,如果要创建 2 int
s 的缓冲区,则应编写 new int[2]
.使用表达式a, b
时,它的计算结果为逗号运算符,<count>
将在示例中num2
。
附言请注意,要正确使用堆内存,您应该更深入地研究C++内存管理。
- 写入向量<向量<bool>>
- 函数向量_指针有不同的原型,我可以构建一个吗
- std::向量与传递值的动态数组
- 将值指定给向量(2D)的向量中的某个位置
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 如何使用向量的template_back函数
- 尝试通过多个向量访问变量时,向量下标超出范围
- 如何通过派生类函数更改基类中的向量
- C++从另一个类访问公共静态向量的正确方法是什么
- 如何将ampl中的集合表示为c++中的向量
- 变量没有改变?通过向量的函数调用
- 迭代时从向量和内存中删除对象
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 计算排序向量的向量中唯一值的计数
- 矩阵向量乘法(cublasDgemv)返回零
- 一对向量构造函数:初始值设定项列表与显式构造
- 将结构向量排序为子组
- 在C++中调整向量中的索引
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么