2010-11-11 87 views
4

我有在我们有一个结构矢量结构

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和宁愿不更新我的编译器

回答

5

你的代码是不合法的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)); 
+0

话又说回来,在PigBen的答案临时数据可以被制作成static变量,因此这将需要更少的空间和快于您的解决方案进行复制。 – 2010-11-11 15:33:44

+0

@Victor:可以肯定的,我可能会使用像PigBen的一个解决方案,除非出于某种原因,我不想。 – 2010-11-11 15:34:58

+0

@Victor:但我非常怀疑,在优化版本中,PigBen的解决方案将比这更快。 – 2010-11-11 15:36:30

6

为什么失败?

,因为它不是有效的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)); 

(这将需要algorithmiterator标准的头。)

+0

同意。把它变成使用'PairId.assign()'从数组初始化可能需要最少的工作。 – 2010-11-11 15:19:49

+0

@Victor:'PairID.assign'是一个很好的提示,谢谢。到目前为止,我一直使用'copy'和'back_inserter'。 – 2010-11-11 15:23:06

4
void staticdata() { 
    Pair temp[] = 
    { 
     {"string","string2",true}, 
     {"string","string3",true}, 
     {"string","string4",false}, 
     {"string","string7",false}, 
     {"string3","string8",false} 
    }; 

    PairID.assign(temp,temp+5); 
} 
1

您可以使用Boost.Assign,这是创建一个矢量,然后填充它一个语法糖:

using std::vector<int>; 
using namespace boost::assign; 
vector<int> v = list_of(Pair("s11", "s12", true)(Pair("s21", "s22", false)); 
0
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);