C ++ std :: list,其中struct包含带struct的列表

时间:2017-05-03 08:04:10

标签: c++

我是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错误。

我评论说要直接为字段赋值,它也会出错。

这样做的正确方法是什么?

4 个答案:

答案 0 :(得分:5)

首先,这一行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。与列表相比,有几个性能优势,默认情况下应该使用它,除非您确实知道需要列表。

答案 1 :(得分:1)

在空列表上调用front()具有未定义的行为。空列表没有第一个项目,因此您不应该尝试访问它。

您可以使用push_back()例如。将项目添加到列表中,然后您可以访问和修改该项目。

list.push_back(Bid());

答案 2 :(得分:1)

您不会在列表中插入元素。如果列表的第一个元素非空,std::list::front将返回列表的第一个元素,但如果列表为空,则行为未定义。

如果列表非空,则

std::list::begin将返回第一个元素的迭代器;如果列表为空,则返回过去的迭代器。

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

答案 3 :(得分: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;
}