2010-11-11 73 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);