【问题标题】:Vector of Vector specific syntaxVector 特定语法的向量
【发布时间】:2017-12-16 14:42:37
【问题描述】:

我通常使用以下语法声明(和定义)我的向量向量,

vector<vector<int>> graph = *new vector<vector<int>>(n, *new vector<int>(n, 0));

这里 n 已经定义好了。这通常在大多数编译器中都能正常工作。但是几天前我尝试将源文件导入另一个系统,它充满了编译错误,例如,
"'>>' 之后的预期主表达式"
我不记得确切的错误,但知道在两边的“>”和“>”之间添加空格后,错误被删除了。即

vector<vector<int> > graph = *new vector<vector<int> >(n, *new vector<int>(n, 0));

我知道语法要求我们在两个 '> 之间添加空格,但我想知道编译器之间是否有任何区别,因为两者都使用 c++11 甚至相同的 IDE。我已经使用这种语法很长时间了,编辑每一个都会非常令人沮丧。更容易知道它适用于哪些编译器。

【问题讨论】:

  • “我通常使用以下语法声明(并定义)我的向量向量”哦,上帝,不。
  • 你为什么用一个浪费内存的指针声明一个非指针
  • *new ... 是内存泄漏。你怎么去delete那个指针?
  • 请不要这样定义你的向量。请以与每个教程完全相同的方式定义它们。
  • C++11 中引入了避免在&gt; &gt; 之间放置空格的功能。在此之前,您需要一个空间。

标签: c++ c++11 vector


【解决方案1】:

我会给你一个两部分的答案:

vector<...> v = *new vector<...>(...)

基本上,您不应该这样做。
Vector 自己进行内存管理,因此不需要原始 new。此外,在这一行中,您为堆上的向量分配内存(仅 12 或 24 个字节,具体取决于您的系统),然后将此向量分配给堆栈上的向量 v(这可能涉及整个向量的内容)。堆上的向量永远不会被删除,因此内存泄漏。

更好:

vector<vector<int>> graph = vector<vector<int>>(n, vector<int>(n, 0));

或者只是

vector<vector<int>> graph(n, vector<int>(n, 0));

现在回答您最初的问题:C++ 标准开始允许 &gt;&gt; 从 C++11 开始关闭嵌套模板(请参阅 this related question),因此您需要将编译器配置为至少使用 C+ +11 标准(通常使用 -std=c++11 标志)。但是,我知道的几乎所有最近的编译器都默认使用了这个标准。

如需更详细的答案,您需要告诉我们您使用的 IDE 和编译器。

【讨论】:

    猜你喜欢
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    • 2018-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多