2011-07-25 82 views
3

可能重複:
how-to initialize 'const std::vector<T>' like a c array如何顯式初始化結構的成員向量?

什麼是正確的語法,以提供一個std顯式的初始化::當它是一個結構的成員向量?這裏的結構:

struct pattern_info 
    { 
     std::string pattern; 
     std::vector<std::string> patterns; 
    }; 

這裏就是我想初始化它(的還在於,我不知道有關的部分):我知道,{}將提供

pattern_info p = { "", ??? }; 

所有結構成員都有合理的默認值,但我寧願不這樣做。

當我與-std =的C++ 0x編譯我可以做到這一點(和它似乎工作):

pattern_info p = { "", {} }; 

我使用gcc版本4.4.5(Debian的4.4.5-8 ),並希望在沒有-std = C++ 0x選項的情況下執行此操作。

+2

你想把它初始化爲**來做什麼?如果你對默認的構造函數感到滿意,你根本不需要寫任何東西。 –

+0

@Buster Smith:按照常見問題,一旦你找到了合適的答案,你應該接受它(它不一定是最高票數的答案) –

+0

@Buster爲了將這個問題轉移到你的註冊賬號上,並要求版主將您的未註冊帳戶與未註冊的帳戶合併。請務必將鏈接複製粘貼到您的國旗評論中的兩個帳戶。 – Gilles

回答

0

如果vector將是空的(如圖你的C++ 0x例如版本),那麼,

pattern_info p = { "" }; 

我想,你甚至可以跳過把""std::string了。如果你想要非空字符串,那麼只需要初始化。爲了擺脫編譯器警告,您可以嘗試:

pattern_info p = {}; 

編輯: 如果你想擺脫的警告,然後提供一個默認的構造函數。

struct pattern_info 
{ 
//... 
    pattern_info() : pattern(""), patterns(0) {} 
}; 

,並聲明,因爲它是:

pattern_info p; 
+0

當我這樣做,我得到這個編譯器警告:patterns.cpp:76:警告:缺少初始值設定爲成員'pattern_info :: patterns' –

+0

您試過嗎,'pattern_info p = {};演示:http:// www .ideone.com/wMtsO – iammilind

+0

是的,這會產生2個編譯器警告,而不是一個。它表示字符串和矢量都沒有initalizers。我編譯-Wextra。當我刪除它時,沒有給出編譯器警告。但我不想刪除-Wextra,因爲我是偏執狂。 –

4

只的C++ 0x的std::vector有這樣的初始化。在當前的C++,你必須使用現有的載體,是這樣的...

std::vector<T> foo; 
...push_back...push...push... 

const std::vector<T> target = foo; 

...或使用的變通辦法像boost::assign

第二種選擇是使用std::vector的替代構造函數之一。其中之一是一個模板,並採用輸入-迭代範圍:

const int foo[] = { 1, 1, 2, 3, 5, 8, 13 }; 
const std::vector<int> bar (foo, 
          foo + (sizeof foo/sizeof *foo)); 
2

此C++ 0x中只可能,如已經陳述。作爲替代方案,您可以使用Boost。看看介紹中給出的例子:
>http://www.boost.org/doc/libs/1_39_0/libs/assign/doc/#intro

+0

OK。謝謝您的幫助。我將使用-std = C++ 0x選項來執行此操作:pattern_info p = {「」,{}};這似乎工作,即使使用-Wextra -Wall-WeffC++也不會產生任何編譯器警告 –