我是C++新手(我以前做过 C,但从未C++)我相信我有语法问题。
我想按价格水平将一些订单分类到一个列表中。 所以我的清单有内部位置:
- 价格水平
- 另一个
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;
}
最初最直观的方法是使用注释行,它可以编译但给出 seg 错误。
我评论说直接为字段赋值,它也出错了。
正确的方法是什么?
首先,这一行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()
的所有其他行也是如此。
旁注:您可能希望使用list.emplace_back
而不是push_back
。此外,您可能希望使用std::vector
而不是std::list
。与列表相比,列表有几个性能优势,除非您真的知道需要列表,否则默认情况下应使用它。
在空列表上调用front()
具有未定义的行为。空列表没有第一项,因此不应尝试访问它。
您可以使用push_back()
例如将项目添加到列表中,然后您可以访问和修改该项目。
list.push_back(Bid());
不要在列表中插入元素。 如果列表不为空,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;
}