我在xcode中运行此代码。为什么我的编译器继续抱怨地图分配
#include <iostream>
#include <map>
#include <deque>
using namespace std;
map<int,deque<int>> bucket;
deque<int> A{3,2,1};
deque<int> B;
deque<int> C;
bucket[1] = A;//Warning "C++ requires a type specifier for all declaration
bucket[2] = B;//Warning "C++ requires a type specifier for all declaration
bucket[3] = C;//Warning "C++ requires a type specifier for all declaration
int main() {
for (auto it:bucket)
{
cout << it.first << "::";
for (auto di = it.second.begin(); di != it.second.end(); di++)
{
cout << "=>" << *di;
}
cout << endl;
}
return 0;
}
就好像我在主内部做同样的事情,它完美地运作
#include <iostream>
#include <map>
#include <deque>
using namespace std;
map<int,deque<int>> bucket;
deque<int> A{3,2,1};
deque<int> B;
deque<int> C;
int main() {
bucket[1] = A;
bucket[2] = B;
bucket[3] = C;
for (auto it:bucket)
{
cout << it.first << "::";
for (auto di = it.second.begin(); di != it.second.end(); di++)
{
cout << "=>" << *di;
}
cout << endl;
}
return 0;
}
输出
1::=>3=>2=>1
2::
3::
Program ended with exit code: 0
这是我缺少的东西。无法理解这种行为。 任何建议,帮助或文档。我看了类似的问题,但没有得到满意的答案
答案 0 :(得分:5)
你不能在全球范围内做这样的事情
int i;
i = 100;
因为在C ++ 11中,您可以在声明时初始化值,如
int i = 100;
或在函数内设置值
int main() {
i = 100;
}
STL初始化也是如此,这就是你的问题的原因
答案 1 :(得分:2)
这是因为三条线......
bucket[1] = A;//Warning "C++ requires a type specifier for all declaration
bucket[2] = B;//Warning "C++ requires a type specifier for all declaration
bucket[3] = C;//Warning "C++ requires a type specifier for all declaration
是陈述。你不能在C语言中执行函数之外的语句(C不是Python)。如果你在main()中移动这三行代码,那么它应该可以正常工作。
答案 2 :(得分:2)
在函数范围之外初始化变量可以做什么
std::deque<int> A{3,2,1};
std::deque<int> B;
std::deque<int> C;
std::map<int, std::deque<int>> bucket {{1, A}, {2 , B}, {3, C}};
答案 3 :(得分:-1)
编译器识别此代码
bucket[1] = A;
bucket[2] = B;
bucket[3] = C;
作为declarations指定类型,因为您无法在函数外部运行可执行代码(调用assignment operator)(或者在声明变量时使用和初始化程序)。 在以下情况下:
map<int,deque<int>> bucket;
deque<int> A{3,2,1};
deque<int> B;
deque<int> C;
map<int,deque<int>>
和deque<int>
是类型说明符。