[英]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.