我通常使用以下语法声明(并定义)我的向量向量
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。我已经使用了这个语法很长时间,编辑每个语法都会非常令人沮丧。知道它运行的编译器会更容易。
答案 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和编译器。