查找并排序列表

时间:2011-10-25 19:17:04

标签: c++ list sorting map

所以我有一个2列的列表,如下所示:

2834    2
2934    1
2712    1
2834    3
2889    1
2659    1
2934    1
2760    1
2173    1
2834    1
2760    1
2834    2

第一列是商品ID,第二列是购买商品的数量,每个商品的价格在另一个文件中。我需要做的是找到订购的每件商品的总数量,再乘以其价格,然后按收入显示前五项。 例如,2834以上订购8次,价格为2美元,因此2834的总收入为16美元。如何找到一个项目的所有出现次数(数量),在某处保存其数量和ID号,并对其他项目执行相同操作,而不重复上一个项目。我被告知地图在这里很有用,但我不知道如何使用它们。

4 个答案:

答案 0 :(得分:4)

使用地图,其中键是ID号,值是数量:

std::map<int, int> quantities;

循环浏览列表并更新地图中的相应条目。您可以使用地图上的[]运算符来访问与给定键对应的值。例如,如果您有数据和数据中的数量,则可以执行以下操作:

quantities[id] += quantity;

无需初始化地图即可工作,因为如果[]运算符要求地图中尚不存在的条目,则会自动插入默认值,并且{{1}的默认值是零。

现在,您可以浏览地图并查找所有商品的价格。 map的迭代器为您提供int,其中第一个元素是地图的键,第二个元素是该键的值。您可以编写这样的循环来打印地图的内容:

pair

如果您找到每件商品的价格并乘以for (std::map<int, int>::const_iterator it = quantities.begin(); it != quantities.end(); ++it) { std::cout << it->first << " " << it->second << std::endl; } ,那么您将拥有所需的商品。

答案 1 :(得分:1)

std :: map会很有用 - 它基本上是一个由键索引的数组。在您的情况下,项目ID将是关键。通常,您只需在地图中放置一个元素:

myMap[key] = value;

例如,假设readFromFile()填写id和qty:

// Declare a map that uses an int as a key, and an int as a value
std::map<int, int> myMap;

while (readFromFile(&id, &qty))
{
    myMap[id] += qty;
}

第一次,[]将创建元素。要迭代最终列表,您可以在地图上使用标准迭代器,就像其他STL容器一样。

答案 2 :(得分:0)

我会定义一个结构product来保存每个项目的信息。结构将包含IDquantityprice 您可以创建一个std::map<int, product>,其中索引是项目的ID 您可以在价格文件中读取,并为每一行创建一个新的product ID和价格,然后将ID作为索引添加到地图中。
然后,您将在销售文件中读取,并且对于每一行,通过product的地图引用ID,并将数字添加到quantity。 最后,您将遍历地图,并写出每个ID,并quantity有序乘以price

我理解正确吗?

答案 3 :(得分:0)

这看起来像是一个关系数据库。 一个表格将包含[Item_ID,Quantity]等记录 另一个表将包含[Item_ID,Price]等记录。

您的任务,如果您选择接受它,就是为每个文件创建一个表。使用第一个表中的Item_ID查找数量。使用Item_ID到第二个表中查找价格。将这两个变量相乘以确定Item_ID的总成本:

unsigned int quantity = Quantity_Table[Item_ID];
double price = Price_Table[Item_ID];
double cost = price * quantity;

首先研究std::map数据结构。同时搜索Stack Overflow for“get getline c ++”以了解如何读取文件。