2012-12-20 11 views
18

C++でベクトルを定義する新しいショートカット方法について質問があります。私はその後、次のクラスにC++ 11関数呼び出しでのベクトルの初期化

struct Tester{ 

    vector< vector<int> > data; 

    Tester(){ 
    data = vector< vector<int> >(); 
    } 

    void add(vector<int> datum){ 
    data.push_back(datum); 
    } 

}; 

があると、予想通り、次の作品:

int main(){ 
    Tester test = Tester(); 
    vector<int> datum = vector<int>{1,2,3}; 
    test.add(datum); 
} 

が、これはしません:

int main(){ 
    Tester test = Tester(); 
    test.add(vector<int>{1,2,3}); 
} 

は、誰かが私に違いを説明していただけますか?どのように私は2番目のmain()で試みるショートカットを行うことができますか?

+1

C++ 11は、テンプレートの括弧の間にスペースを残さないことができます: 'ベクトル>は'合法です。 – zneak

+0

また、2回目の試みで得たエラーを投稿する必要があります。私の頭の中で、C++ 11コンパイラが手元になくても、イニシャライザリスト( 'test.add({1,2,3})')か括弧をつけて( ' test.add(ベクトル({1,2,3}))))。 – zneak

+6

'data = vector < vector>();'は完全に余計なものであり、C++のコンストラクタと初期化において根本的な誤解を指摘するかもしれません。 – PlasmaHH

答えて

21

あなたのコードは大丈夫ですが、使用しているコンパイラは(これは古いようです)。

ところで、あなたはあまりにも多くをやっています。

これは十分なはずです。

vector<int> datum{1,2,3}; //initialization 

test.add({1,2,3}); //create vector<int> on the fly and pass it to add() 

あなたのコンパイラを更新することを忘れないでください。

また、data = vector< vector<int> >();も多すぎます。それは必要ではありません。ベクターは自動的に構築されます。つまり、クラスのコンストラクタを空のままにしておくこともできますし、何もしないので、まったく必要はありません。

+0

ありがとう!それらは素敵なショートカットです。私はコンストラクタが必要ではないことに同意します - 私は明示的になっていました。私の元のコードがうまくいくことが分かります。私はemacsバッファなどを保存していない必要があります。 – andyInCambridge

1

あなたがデータのコピーを回避したい場合:

#include <vector> 
#include <iostream> 

using namespace std; 

struct Tester 
{ 
    vector< vector<int> > data; 

    Tester() 
    { 
     data = vector< vector<int> >(); 
    } 

    void add(vector<int> && datum) 
    { 
     data.push_back(std::move(datum)); 
    } 

}; 


int main() 
{ 
    Tester test = Tester(); 
    test.add(vector<int>{1,2,3}); 

    for(const auto &v : test.data[0]) 
     std::cout << v << std::endl; 
} 
関連する問題