我有list<string> myList
作为我班级的私人属性。此列表的内容在编译时是已知的并且是常量。是否有任何紧凑的方式(在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.){
}
答案 0 :(得分:4)
我倾向于这样做:
static const string my_strs[] =
{
"str1",
"str2",
"str3"
};
static const num_my_strs = sizeof(my_strs)/sizeof(my_strs[0]);
然后到了初始化list
:
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的方法。
编辑3 我在标准中找到了与此相关的相关段落。上面的表达式(int a[2]; &a[2];
)实际上是未定义的行为。我已经编辑了我的答案,不使用该方法。感谢@MooingDuck提出这个问题。
答案 1 :(得分:3)
此代码未经过全面测试,但如果你不能在C ++ 11中使用新的和酷的东西,我会建议这样做:
class MyClassCreator
{
MyClass result;
public:
MyClassCreator(std::string param)
{
result.myList.push_back(param);
}
MyClassCreator& operator()(std::string param)
{
result.myList.push_back(param);
return *this;
}
operator MyClass() { return result; }
};
用法:
MyClass c = MyClassCreator("object1")("object2")("object3");