返回元组c ++的向量

时间:2014-12-01 18:15:12

标签: 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]);

但它并没有正确保存元组,因为尝试访问它们的值会返回奇怪的错误值。

这显然是由于对如何分配内存的误解。我能理解为什么第一个例子以这种方式失败但我不理解第二个例子的问题。

3 个答案:

答案 0 :(得分:3)

使用一对而不是指针:

std::vector<std::pair<int, int> > distr;
// Do some code
distr.emplace_back(num1, num2);

答案 1 :(得分:3)

使用时

distr.push_back(new int [num1, num2]);

您没有创建一个填充了num1,num1的双元素数组。这将完成如下:

new int[2] {num1, num2}

我建议不要使用这种方法。如果你的所有元组都是相同的大小,我会使struct表示该数据类型(在特殊情况下为2,你甚至可以使用std::pair

答案 2 :(得分:2)

首先,您应该了解,“经典”C和C ++数组只是已分配内存的缓冲区。在您的示例中,tuple只是指向2个整数的已分配缓冲区的指针。所以,当你推送tuple的值时,你只需要添加两次相同的指针。数组本身不会复制到std :: vector,因此,您将使用包含两个指向内存SAME区域的指针的向量结束。要实现所需的行为,您可以使用更多高级C ++ - ish数据类型,例如std::tuplestd::array

说到你的第二个代码片段,它只是语法误解:表达式new <type>[<count>]创建了一个类型为tuple的值的内存缓冲区(类似于<type>,但在HEAP上)。因此,如果要创建2 int s的缓冲区,则应编写new int[2]。当您使用a, b表达式时,它的评估结果为comma operator,样本中的<count>将为num2

P.S。请注意,要正确使用堆内存,您应该更深入地研究C ++内存管理。