矢量特定语法的向量

时间:2017-12-16 14:42:37

标签: c++ c++11 vector

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

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

这里已经定义了n。这通常适用于大多数编译器。但是几天前我尝试将源文件导入到另一个系统,并且它充满了编译错误,例如, “'&gt;&gt;'后的预期主要表达“
我不记得确切的错误,但确实知道在'&gt;'之间添加空格后和'&gt;'双方都删除了错误。即。

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

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

1 个答案:

答案 0 :(得分:2)

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

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 ++标准开始允许>>从C ++ 11开始关闭嵌套模板(请参阅this related question),因此您需要配置编译器以用于至少是C ++ 11标准(通常使用-std = c ++ 11标志)。但是,我所知道的几乎所有最近的编译器都默认使用了这个标准。

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