如何以某种格式为用户显示对象向量

C}++ How to display a vector of objects for the user in a certain format

本文关键字:用户 显示 对象 向量 格式      更新时间:2023-10-16

好吧,我一直在为此自责,我不认为在这篇文章中包含我的所有代码来找到答案。我的部分问题是我真的不知道该怎么表达这个问题。

假设我有一个名为inventory的对象向量,它从我的Item类中获取对象。我做了一个函数:inventory.addItem(itemObject)

所以我只需使用inventory.push_back(itemObject)就可以成功添加项目作用

当我显示矢量时,我可以迭代它并打印到控制台

iterator->itemObject.getItemName()

但我的主要目标是打印出我有多个相同的对象,打印出其中一个getItemName,然后打印出getItemName值相等的对象数量的整数值,并打印出旁边的值:

例如:

Item hammer("Hammer");  
Item sword("Sword");
inventory.addItem(hammer);  
inventory.addItem(hammer);  
inventory.addItem(hammer);  
inventory.addItem(sword);

如果我使用我的inventory.displayInventory()函数,我所做的就是遍历每个对象,并访问对象的getItemName()函数,并将其输出给我:

"Hammer"  
"Hammer"  
"Hammer"  
"Sword"

我的目标是在我的inventory.displayInventory()函数中有:

"Hammer" (3)  
"Sword" (1)

有人知道我如何操作for循环迭代来帮助实现这一点吗?或者这听起来是一个彻头彻尾的坏主意,我应该坚持让它们分开打印吗?

谢谢你的建议!

您可以使用map来执行此操作:

std::map<std::string, int> items;
for(Item const& item : inventory) {
items[item.getItemName()]++;
}
for(auto const& pair : items) {
std::cout << pair.first << ": (" << pair.second << ")" << std::endl;
}

如果您需要比"项目名称"更具体的计算,这也是可能的,尽管您需要确保Item类重载operator<operator==,因为std::map要求其键是可排序的。不过,如果你已经这样做了,那么代码就稍微简单一点:

std::map<Item, int> items;
for(Item const& item : inventory) {
items[item]++;
}
for(auto const& pair : items) {
std::cout << pair.first.getItemName() << ": (" << pair.second << ")" << std::endl;
}

您想要的是地图而不是矢量:

#include <iostream>
#include <map>
struct Item {
std::string name;
Item(std::string name) : name(name){}
bool operator<(const Item& other) const { return name < other.name;}
};
struct Inventory {
std::map<Item,size_t> data;
void addItem(const Item& item){ data[item]++; }
void print(){
for (auto e : data){
std::cout << e.first.name << " (" << e.second << ")n";
}
}
};

int main(){
Item hammer("hammer");
Item knife("knife");
Inventory inventory;
inventory.addItem(hammer);
inventory.addItem(hammer);
inventory.addItem(knife);
inventory.print();
} 

实时演示

Item需要一个operator<,所以你可以把它放在地图上。如果密钥不存在,data[item]++;会将其添加到映射中(如果不存在,则默认情况下会初始化计数),并增加计数。最后,打印库存可以通过一个简单的循环来完成。

PS:或者,您可以使用std::unordered_map或其他关联容器。