C++ std::list with struct containing list with struct



我是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;
}

最新更新