C++ 结构向量
我有另一个人给我的一些代码,其中我们有一个结构C++ 结构向量,c++,vector,struct,C++,Vector,Struct,我有另一个人给我的一些代码,其中我们有一个结构 struct Pair { string s1; string s2; bool equivalent; }; 然后他建立了这些硬编码结构的向量 std::vector<Pair> PairID; staticdata() { PairID={{"string","string2",true}, {"string","string3",true}, {"stri
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}
};
}
std::vector PairID;
静态数据(){
PairID={{“string”,“string2”,true},
{“string”,“string3”,true},
{“string”,“string4”,false},
{“string”,“string7”,false},
{“string3”,“string8”,false}
};
}
不幸的是,我的编译器在PairID={{“string”,“string2”,true}行上抱怨
为什么会这样?他建议使用-std=c++0x进行编译,但我的编译器(gcc 4.2)不支持。有没有一种简单的方法来转换代码使其工作?为什么失败
我正在使用MacOSX,不想更新我的编译器
为什么会失败
因为它不是有效的C++,它将是在C++ 0x中。但是到目前为止,它还不正确。而且由于编译器还不支持C++ 0x,所以需要硬地执行,即一次填充向量一个元素,或者从C数组复制……/p>
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));
(这将要求<代码>算法> <代码>迭代器< /C>标准头。)您的代码不是合法的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));
结构对{
字符串s1;
字符串s2;
布尔等价物;
};
配对(常量字符串和s1,常量字符串和s2,布尔等效)
{
配对ret;
ret.s1=s1;
ret.s2=s2;
ret.等效=等效;
返回ret;
}
//在初始化代码的某个地方。。。
std::向量PairID;
PairID.push_back(使_配对(“string”,“string2”,true));
PairID.push_back(使_配对(“string”,“string3”,true));
PairID.push_back(使_配对(“string”,“string4”,false));
PairID.push_back(使_配对(“string”,“string7”,false));
PairID.push_back(使_配对(“string3”,“string8”,false));
您可以使用Boost.Assign,它是创建向量然后填充向量的语法糖:
using std::vector<int>;
using namespace boost::assign;
vector<int> v = list_of(Pair("s11", "s12", true)(Pair("s21", "s22", false));
使用std::vector;
使用名称空间boost::assign;
向量v=(对(“s11”、“s12”,真)(对(“s21”、“s22”,假))的列表u;
结构对
{
字符串s1;
字符串s2;
布尔等价物;
};
std::向量PairID;
配对;
pair.s1=“abc”;
pair.s2=“abc”;
pair.equality=真;
PairID.向后推(一对);
如果你事先知道向量的大小,那么你可以这样做
您可以使用结构的任何临时实例,并将默认值指定给该实例,然后使用常规指定,如
typedef struct mystruct{
int x;
char name[10];
}mystruct;
mystruct default;
default.x = 1;
strcpy(default.name,"default_name");
vector <mystruct> v(10,default);
typedef结构mystruct{
int x;
字符名[10];
}我的结构;
我的结构违约;
默认值x=1;
strcpy(default.name,“default_name”);
向量v(10,默认值);
同意。使用PairId.assign()将其从数组转换为初始化
可能是需要最少工作的地方。@Victor:PairID.assign
是一个很好的提示,谢谢。我一直使用copy
和back\u inserter
直到现在。然后,PigBen答案中的临时数据可以变成一个常量静态变量,因此占用的空间更少,读取速度更快复制比您的解决方案更有效。@Victor:当然,我可能会使用类似PigBen的解决方案,除非出于任何原因我不想使用。@Victor:但我严重怀疑,在优化构建中,PigBen的解决方案会比这更快。
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);
typedef struct mystruct{
int x;
char name[10];
}mystruct;
mystruct default;
default.x = 1;
strcpy(default.name,"default_name");
vector <mystruct> v(10,default);