我是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错误。
我评论说要直接为字段赋值,它也会出错。
这样做的正确方法是什么?
答案 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;
}