【问题标题】:create vector with new elements使用新元素创建向量
【发布时间】:2021-03-11 05:57:19
【问题描述】:

所以我有以下

vector<vector< tuple<string, double>*>*>* graph;

一个二维向量,带有一个字符串和双精度元组。 我想用一定的大小初始化图(2d向量)和 一个新的向量*>,在大(外)向量的每个元素中

我使用了以下行

graph = new vector<vector<tuple<string, double>*>*>(67, new vector< tuple<string,double>*>());

这个东西有效,但是当我试图释放它时,我发现我创建的所有新向量都是 相同的向量。 意思是,所有元素都指向同一个向量。我明白为什么会这样,但是 有没有一种方法可以初始化所有向量而无需执行 for 循环,即

for(int i....)
    graph->push_back(new vector< tuple<string,double>*>);

【问题讨论】:

  • 处理指针的原因是什么?
  • 是的,这里的指针一定会让您立即后悔。特别不适合单个double
  • new 的那个参数被评估一次,所以是的,你会得到 N 个相同对象的副本。这是因为指针被复制了。如果您使用的是相同的非指针版本,它可以将它们复制到不同的实例。
  • 嗨,我使用所有这些指针是因为我倾向于在堆上分配所有内容。我不知道我需要多少个向量,可能是数百个。所以我分配一切

标签: c++ vector initialization


【解决方案1】:

问题总结:

排队

graph = new vector<vector<tuple<string, double>*>*>(67, new vector< tuple<string,double>*>());

使用std::vector 的构造函数3 (reference) 这将评估new vector&lt;tuple&lt;string,double&gt;*&gt;() 一次,然后使用此指针的67 副本创建一个向量。

解决办法:

除非有充分的理由,否则不要使用指针。使用

vector<vector<tuple<string, double>>> graph;

那么你可以简单地做

graph.resize(67);

插入 67 个默认构造值。不需要指针。

也许您已经习惯了经常使用new 的语言,但您不应该在 C++ 中这样做。 std::vectorstd::string 是管理底层动态数组的相当小的对象。创建指向它们的指针通常不是您想要的,而且还可能会降低性能。

【讨论】:

    猜你喜欢
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多