c++ - 初始化一个容器,它是一个类的私有(private)成员变量

标签 c++ list initialization initializer c++03

我有一个 list<string> myList作为我类(class)的私有(private)属性。这个列表的内容在编译时是已知的并且是常量。是否有任何紧凑的方式(在 C++03 中)来初始化它的值?我只能想到这个:

MyClass::MyClass(){
myList.push_back(string("str1"));
myList.push_back(string("str2"));
myList.push_back(string("str3"));
etc.
}

我想要这样的东西:

MyClass::MyClass():list("str1","str2","str3",etc.){
}

最佳答案

我倾向于做这样的事情:

static const string my_strs[] =
{
  "str1",
  "str2",
  "str3"
};

static const num_my_strs = sizeof(my_strs)/sizeof(my_strs[0]);

然后到了初始化列表的时候:

MyClass::MyClass()
:  myList(my_strs, my_strs + num_my_strs)
{
}

...或者:

MyClass::MyClass()
{
  copy( my_strs, my_strs+num_my_strs, back_inserter(myList));
}

这种方法有利也有弊。明显的缺点是您现在拥有 2 个数据拷贝。这也提出了一个问题,如果你在编译时知道内容并且它们永远不会改变,你甚至还需要 list 吗?为什么不直接使用 static const 数组?

从好的方面来说,初始化列表的代码是单行代码,即使您更改了处理到列表中的编译时常量数据,也永远不需要更改。

编辑:您可以使用标准库算法,如 find 和普通的旧 C 风格数组。例如:

const string* it = std::find(my_strs, my_strs+num_my_strs, "str1");
if( it == (my_strs+num_my_strs) ) // functionally same as 'list.end()' eg, item not found
{ 
  // not found
}
else
{
  // found -- it points to item found
  string found_item = *it;
}

Edit2 是否像 int a[2]; 这样的表达式&a[2]; 是否明确定义正在争论中。我已经编辑了上面的指针数学以使用众所周知的不会引起 UB 的方法。

Edit3 我在标准中找到了与此相关的相关段落。上面的表达式 (int a[2]; &a[2];) 实际上是未定义行为。我已经编辑了我的答案以不使用该方法。感谢@MooingDuck 提出这个问题。

关于c++ - 初始化一个容器,它是一个类的私有(private)成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13274870/

相关文章:

c++ - 使用迭代器从 STL 列表中删除 C++ 结构

c - 如何在 C 中创建结构体文字的数组文字?

java - 在Java中,声明多维数组后,是否可以用文字部分填充它?

c++ - 返回 0 数组的数组按位或异或

c++ - 使用 constexpr auto/char-array 变量观察到的不同行为

python - 如何在列表列表中查找具有最大值的列表(其中嵌套列表包含字符串和数字)?

Python:如何在嵌套循环的第一列中搜索?

Java - 外部变量声明

c++ - 通用工厂设计模式的实现

c# - 如何将 UDT 的 SAFEARRAY 传递给 C# 中的非镜像代码