aug*_*tin 17 c++ struct associative-array initialization map
我使用map作为ID - > value的关联数组,其中值是定义对象的结构:
#include <map>
struct category {
int id;
std::string name;
};
std::map<int, category> categories;
int main() {
categories[1] = {1, "First category"};
categories[2] = {2, "Second category"};
}
Run Code Online (Sandbox Code Playgroud)
上面的代码用g ++编译,但有以下警告:
warning: extended initializer lists only available with -std=c++0x or -std=gnu++0x
Run Code Online (Sandbox Code Playgroud)
我在这里阅读了关于struct初始化的各种问题/答案,但我仍然有点困惑.我有一系列相关问题:
我可以添加编译器选项-std = c ++ 0x并完成警告,但仍然没有更明智的基础问题.如果我在类别结构中添加方法,事情会不会破裂?
以更符合C++ 03的方式初始化此POD结构(类别)的最佳方法是什么?
基本上,我还不确定以某种方式而不是另一种方式做事的后果.这种关联数组(其中关键是对象的ID)的很容易与PHP,我还在学习正确的方法做它在C++.在上面的代码中是否有任何我应该注意的事项?
编辑
下面的问题是相关的,但是当我第一次看到他们,我不明白的答案:
c + +初始化匿名结构
的C++初始化结构与数组作为成员
用C初始化结构++
CB *_*ley 20
在C++(ISO/IEC 14882:2003)中,括号括起的表达式列表可用于在定义它的声明中初始化聚合类型的变量.
例如
struct S { int a; std::string b; };
S x = { 39, "Hello, World\n" };
Run Code Online (Sandbox Code Playgroud)
的聚合类型是数组或没有用户声明的构造函数,没有私有或保护的非静态数据成员,没有基类,也没有虚拟函数的类.请注意,类聚合不必是POD类,并且任何数组都是聚合,无论它是数组的类型是聚合.
但是,括号括起的表达式列表仅作为聚合的初始化程序有效,通常不允许在其他上下文中使用,例如赋值或类构造函数的成员初始化列表.
在下一版本的C++(C++ 0x)的当前草案中,在更多上下文中允许括号括起的表达式列表(brace-init-list),并且当从这样的初始化列表初始化对象时,它被称为列表- 初始化.
允许这样的列表的新上下文包括函数调用中的参数,函数返回,构造函数的参数,成员和基本初始值设定项以及赋值的右侧.
这意味着这在C++ 03中无效.
int main() {
categories[1] = {1, "First category"};
categories[2] = {2, "Second category"};
}
Run Code Online (Sandbox Code Playgroud)
相反,你可以做这样的事情.
int main() {
category tmp1 = { 1, "First category" };
category tmp2 = { 2, "Second category" };
categories[1] = tmp1;
categories[2] = tmp2;
}
Run Code Online (Sandbox Code Playgroud)
另外.
int main() {
category tmpinit[] = { { 1, "First category" },
{ 2, "Second category" } };
categories[1] = tmpinit[0];
categories[2] = tmpinit[1];
}
Run Code Online (Sandbox Code Playgroud)
或者,您可以考虑为您的类型制作工厂功能.(您可以为您的类型添加构造函数,但这会使您的类成为非聚合,并且会阻止您在其他位置使用聚合初始化.)
category MakeCategory( int n, const char* s )
{
category c = { n, s };
return c;
}
int main()
{
categories[1] = MakeCategory( 1, "First category" );
categories[2] = MakeCategory( 2, "Second category" );
}
Run Code Online (Sandbox Code Playgroud)
Mep*_*ane 10
在当前的C++标准中,您可以使用初始化列表来初始化仅包含POD值的数组和结构.下一个标准(又名C++ 0x或C++ 1x)将允许在包含非POD类型的结构上执行相同的操作,例如std :: string.这就是警告的内容.
我建议你添加一个简单的构造函数来category获取id和名称,然后简单地调用该构造函数:
#include <map>
#include <string>
struct category {
category() : id(0), name() {}
category(int newId, std::string newName)
: id(newId), name(newName) {}
int id;
std::string name;
};
std::map<int, category> categories;
int main() {
categories[1] = category(1, "First category");
categories[2] = category(2, "Second category");
}
Run Code Online (Sandbox Code Playgroud)
我知道这很旧,但也可以使用
std::map<int, std::pair<std::string, int>> categories
Run Code Online (Sandbox Code Playgroud)
或者:
std::map<int, std::tuple<std::string, int, double>> categories
Run Code Online (Sandbox Code Playgroud)
如果需要更多。
| 归档时间: |
|
| 查看次数: |
51517 次 |
| 最近记录: |