返回元组 c++ 的向量

Returning a vector of tuples c++

本文关键字:向量 c++ 元组 返回      更新时间:2023-10-16

我正在尝试创建并返回两个元素数组的向量(我将称为元组(,但是我遇到了问题。

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++内存管理。