矢量结构
我有在我们有一个结构矢量结构
struct Pair {
string s1;
string s2;
bool equivalent;
};
然后,他建立了这些结构的硬编码
std::vector<Pair> PairID;
staticdata() {
PairID={{"string","string2",true},
{"string","string3",true},
{"string","string4",false},
{"string","string7",false},
{"string3","string8",false}
};
}
不幸的是我的编译器的矢量另一个人给我一些代码在抱怨上线PairID = {{ “字符串”, “字符串2”,真},
这是为什么?他建议使用-std = C++ 0x进行编译,但我的编译器(gcc 4.2)不支持这一点。有没有简单的方法来转换代码,以便它的作品?为什么它失败?
我使用Mac OSX和宁愿不更新我的编译器
你的代码是不合法的C++。这是合法的C++ 0x但已经有许多更改语言。所以如果你想把这些代码编译成C++代码,你需要改变它。
PigBen的解决方案是一种方式,它的问题是临时数据可能会被破坏很多次,或者长期存在。
这里的另一种方式:
struct Pair {
string s1;
string s2;
bool equivalent;
};
Pair make_Pair(const string& s1, const string& s2, bool equivalent)
{
Pair ret;
ret.s1 = s1;
ret.s2 = s2;
ret.equivalent = equivalent;
return ret;
}
// somewhere in the init code...
std::vector<Pair> PairID;
PairID.push_back(make_Pair("string","string2",true));
PairID.push_back(make_Pair("string","string3",true));
PairID.push_back(make_Pair("string","string4",false));
PairID.push_back(make_Pair("string","string7",false));
PairID.push_back(make_Pair("string3","string8",false));
为什么失败?
,因为它不是有效的C++。它的将是,在C++ 0x。但到目前为止,这仅仅是无效的。而且,由于你的编译器还不支持的C++ 0x,你需要做的是硬盘的方式,即在一个时间向量一个元素填充,或从C数组复制...:
Pair data[] ={ {"string","string2",true},
{"string","string3",true},
{"string","string4",false},
{"string","string7",false},
{"string3","string8",false} };
PairID.assign(data, data + sizeof(data)/sizeof(Pair));
(这将需要algorithm
和iterator
标准的头。)
同意。把它变成使用'PairId.assign()'从数组初始化可能需要最少的工作。 – 2010-11-11 15:19:49
@Victor:'PairID.assign'是一个很好的提示,谢谢。到目前为止,我一直使用'copy'和'back_inserter'。 – 2010-11-11 15:23:06
void staticdata() {
Pair temp[] =
{
{"string","string2",true},
{"string","string3",true},
{"string","string4",false},
{"string","string7",false},
{"string3","string8",false}
};
PairID.assign(temp,temp+5);
}
您可以使用Boost.Assign,这是创建一个矢量,然后填充它一个语法糖:
using std::vector<int>;
using namespace boost::assign;
vector<int> v = list_of(Pair("s11", "s12", true)(Pair("s21", "s22", false));
struct Pair
{
string s1;
string s2;
bool equivalent;
};
std::vector<Pair> PairID;
Pair pair;
pair.s1 = "abc";
pair.s2 = "abc";
pair.equivalent = TRUE;
PairID.push_back(pair);
话又说回来,在PigBen的答案临时数据可以被制作成static变量,因此这将需要更少的空间和快于您的解决方案进行复制。 – 2010-11-11 15:33:44
@Victor:可以肯定的,我可能会使用像PigBen的一个解决方案,除非出于某种原因,我不想。 – 2010-11-11 15:34:58
@Victor:但我非常怀疑,在优化版本中,PigBen的解决方案将比这更快。 – 2010-11-11 15:36:30