簡體   English   中英

C ++ std :: list與struct包含list與struct

[英]C++ std::list with struct containing list with struct

我是C ++的新手(我之前做過C,但從未使用過C ++),我相信我有語法問題。

我想按價格水平對一些訂單進行排序。 所以我的清單里面有職位:

  • 價格水平
  • 另一個std::list以該價格std::list所有訂單。 (命令)

Order是具有以下內容的結構:

  • userid
  • quantity

所以我結束了:

#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;
}    

最初最直觀的方法是使用注釋行,它可以編譯但會產生段錯誤。

我評論了直接將值分配給字段,它也存在段錯誤。

這樣做的正確方法是什么?

首先,此行list.begin(); 那一行list.front().Orders.begin(); 什么都不要做 刪除它們。

現在的主要問題。 列表中的元素不會自動顯示。 列表在創建時為空。 看看這條線:

list.front().price = 13000;

那時您的列表為空,沒有.front() 因此,它的行為不確定,可能是段錯誤的原因。

這樣可以:

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().front()

旁注:您可能要使用list.emplace_back而不是push_back 另外,您可能要使用std::vector而不是std::list 與列表相比,它具有一些性能優勢,並且除非您確實知道需要列表,否則默認情況下應使用它。

在空列表上調用front()具有未定義的行為。 空列表沒有第一項,因此您不應該嘗試訪問它。

您可以使用push_back()例如。 將項目添加到列表中,然后可以訪問和修改。

list.push_back(Bid());

您不會在列表中插入元素。 如果非空,則std::list::front將返回std::list::front的第一個元素,但是如果列表為空,則行為未定義。

如果列表非空,則std::list::begin返回一個迭代器到第一個元素;如果列表為空,則返回過去的迭代器。

使用std::list::push_back將新元素插入列表。

謝謝大家的明確解釋和建議。 我以以下工作代碼結束:

#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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM