gpt4 book ai didi

c++ - 如何初始化以结构为值的映射?

转载 作者:IT老高 更新时间:2023-10-28 22:08:56 26 4
gpt4 key购买 nike

我使用映射作为 ID 的关联数组 -> 值,其中值是定义对象的结构:

#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"};

}

上面的代码用g++编译,但是有以下警告:

warning: extended initializer lists only available with -std=c++0x or -std=gnu++0x

我在这里阅读了有关结构初始化的各种问题/答案,但我仍然有点困惑。我有一系列相关问题:

  1. 我可以添加编译器选项 -std=c++0x 并完成警告,但仍然对潜在问题一无所知。如果我在类别结构中添加一个方法,事情不会中断吗?

  2. 以更符合 C++03 的方式初始化此 POD 结构(类别)的最佳方法是什么?

  3. 基本上,我还不确定以一种方式而不是另一种方式做事的后果。这种关联数组(其中键是对象的 ID)在 PHP 中很容易,我仍在学习在 C++ 中执行此操作的正确方法。在上面的代码上下文中我有什么需要注意的吗?

编辑
以下问题是相关的,但我第一次阅读时没有理解答案:
C++ initialize anonymous struct
c++ Initializing a struct with an array as a member
Initializing structs in C++

最佳答案

在 C++ (ISO/IEC 14882:2003) 中,括号括起来的表达式列表可用于在定义它的声明中初始化 聚合 类型的变量。

例如

struct S { int a; std::string b; };

S x = { 39, "Hello, World\n" };

聚合 类型是一个数组或类,没有用户声明的构造函数,没有私有(private)或 protected 非静态数据成员,没有基类,也没有虚函数。请注意,类 aggregate 不必是 POD 类,并且任何数组都是 aggregate,无论它是数组的类型是否是聚合。

但是,用大括号括起来的表达式列表仅作为聚合的初始值设定项有效,通常不允许在其他上下文中使用,例如赋值或类构造函数的成员初始化列表。

在下一个 C++ 版本 (C++0x) 的当前草案中,允许在更多上下文中以及当对象位于从这样的 initializer list 初始化,它被称为 list-initialization

允许此类列表的新上下文包括函数调用中的参数、函数返回、构造函数的参数、成员和基初始化器以及赋值的右侧。

这意味着这在 C++03 中无效。

int main() {
categories[1] = {1, "First category"};
categories[2] = {2, "Second category"};
}

相反,您可以这样做。

int main() {
category tmp1 = { 1, "First category" };
category tmp2 = { 2, "Second category" };

categories[1] = tmp1;
categories[2] = tmp2;
}

或者。

int main() {
category tmpinit[] = { { 1, "First category" },
{ 2, "Second category" } };
categories[1] = tmpinit[0];
categories[2] = tmpinit[1];
}

或者,您可以考虑为您的类型创建一个工厂函数。 (您可以为您的类型添加一个构造函数,但这会使您的类成为非聚合类,并且会阻止您在其他地方使用聚合初始化。)

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" );
}

关于c++ - 如何初始化以结构为值的映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4396560/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com