2017-05-03 30 views
1

私はC++を新しくしました(私は以前はCでしたが、C++はしませんでした)。struct with struct with struct

いくつかの注文を価格レベルで並べ替えてリストにしたいと考えています。 は、だから私のリストは、内部に位置しています

  • 価格水準
  • その価格ですべての注文を持つ別のstd::list。 (受注)

Orderが持つ構造体である:

#include<iostream> 
#include<list> 
using namespace std; 

typedef struct Order { 
    int userid; 
    int qty; 
} Order; 

typedef struct Bid { 
    int price; 
    list<Order> Orders; 
} Bid; 

typedef list<Bid> bids; 

int main(void) 
{ 
    bids list; 
    Order order_to_insert; 

    list.begin(); 
    list.front().price = 13000; 

    order_to_insert.userid = 3; 
    order_to_insert.qty = 20; 


    list.front().Orders.begin(); 
    list.front().Orders.front().userid =3; 
    list.front().Orders.front().qty = 20; 
    // list.front().Orders.front() = order_to_insert; // compiles even if i uncomment this. 


    cout << "Liste : " << list.front().price << endl; 
    cout << list.front().Orders.front().qty << endl; 

    return 0; 
}  

最初に最も直感的な方法を:

  • userid
  • quantity

だから私はで終了しました〜されたコメント行を使用すると、コンパイルされますが、seg faultが返されます。

私はフィールドに値を直接割り当てることにコメントしました。

これを行う適切な方法は何ですか?

+1

- あなたはより説明的なものに 'list'を変更することを検討することをお勧めします(' bidList'などのように。)。 –

+1

'namespace std'を避け、特に' list'を型( 'std :: list')として変数名として使うときは避けてください。 – Jarod42

+0

C++で始めるときは、[良いC++の書籍](http://stackoverflow.com/q/388242/1782465)のリストに興味があるかもしれません。 – Angew

答えて

5

まず、この行list.begin();とその行list.front().Orders.begin();は何もしません。削除してください。

ここでは主な問題です。リスト内の要素は自動的には表示されません。リストは作成時には空です。この行を見て:

list.front().price = 13000; 

その時点であなたのリストは空で、何.front()はありません。したがって、その未定義の動作、おそらくsegfaultの原因です。

これが行います。

Bid bid; 
list.push_back(bid); 
list.front().price = 13000; 
// or if C++11 
list.emplace_back(); 
list.front().price = 13000; 

同じことがlist.front().Orders.front()のために行くと、他のすべての行が.front()を使用します。

サイドノート:push_backの代わりにlist.emplace_backを使用します。またstd::listの代わりにstd::vectorを使用することもできます。リストにはいくつかのパフォーマンス上の利点があり、実際にリストが必要であることが分かっていない限り、デフォルトで使用する必要があります。

+0

私は要素を挿入することができるので、先行するすべてのレコードを移動することができるので、リストを使用しています。その位置によって要素に直接アクセスする必要はありません...(Scitt Meyerの本、効果的なSTLから得ました。私にお知らせください。これが間違っている場合は教えてください。 お返事ありがとうございます、私は現在それを試しています。 – jmary

+0

別のコンテナを使用する正当な理由がない限り、 'vector'を使用してください! – Ajay

+0

@jmary 'std :: vector'がさらに効率的です。巨大なリストを扱っていない限り。あなたは、その位置で要素にアクセスするつもりはないと言います。あなたはリストを反復しようとしていますか?ベクトルは、リストを速くして(1つのメモリブロック、逆参照ポインタ+ CPUプリフェッチャなし)繰り返し実行します。とにかく、それを測る。 – freakish

1

空のリストにfront()を呼び出すと、定義されていない動作が発生します。空のリストには最初の項目がないので、アクセスしようとすべきではありません。

push_back()などを使用できます。リストに項目を追加します。リストにアクセスして変更することができます。

list.push_back(Bid()); 
1

あなたのリストに要素を挿入しません。 std::list::frontは、空でない場合はリストの最初の要素を返しますが、リストが空の場合の動作は未定義です。

std::list::beginは、リストが空でない場合は最初の要素に、リストが空の場合は過去と最後のイテレータにイテレータを返します。

std::list::push_backを使用して、新しい要素をリストに挿入します。

0

ご迷惑をおかけして申し訳ありません。 私は、次の作業のコードで終了しました:それはタイプの後に、変数に名前を付けるために紛らわしいです

#include <iostream> 
#include <list> 
using namespace std 

typedef struct Order { 
    int userid; 
    int qty; 
} Order; 

typedef struct Bid { 
    int price; 
    list<Order> Orders; 
} Bid; 

typedef list<Bid> bids; 

int main(void) 
{ 
    Bid bid; 
    bids bidList; 
    Order order_to_insert; 

    bidList.push_back(bid); 
    bidList.front().price =13000; 

    order_to_insert.userid = 3; 
    order_to_insert.qty = 20; 

    bidList.front().Orders.push_back(order_to_insert); 
    bidList.front().Orders.front() = order_to_insert; 

    cout << "Liste : " << bidList.front().price << endl; 
    cout << bidList.front().Orders.front().move << endl; 

    return 0; 
} 
+0

'.push_back(bid);'は実際には 'bid;'のコピーをしています。ですから不要なコピーを避けるために '.emplace_back()'が優先されます。 – freakish

+0

なぜあなたは 'push_back(order_to_insert)'をしてすぐに 'order_to_insert'で新しい要素を上書きしますか? –

+0

この 'typedef struct T1 {..} T2'構文はC++では使わないでください。 'struct T {..}'と書いてください。 –