C++ C} &x2B+;如何以特定格式为用户显示对象向量

C++ C} &x2B+;如何以特定格式为用户显示对象向量,c++,string,vector,format,output,C++,String,Vector,Format,Output,好吧,我一直在为此痛打自己,我不认为在这篇文章中包含我所有的代码来找到答案。我的部分问题是我真的不知道该如何表达这个问题 假设我有一个名为inventory的对象向量,它从我的Item类中获取对象。我做了一个函数:inventory.addItem(itemObject) 因此,我只需使用inventory.push_back(itemObject) 功能 当我显示向量时,我可以遍历它并打印到控制台 iterator->itemObject.getItemName() 但我的主要目标是打

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

假设我有一个名为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循环迭代来帮助实现这一点吗?或者这听起来像个坏主意,我应该坚持把它们分开打印

谢谢你的建议

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

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

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

#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();
} 
#包括
#包括
结构项{
std::字符串名;
项(std::string name):名称(name){}

bool运算符使用例如(或可能)如何?这样您就可以很容易地获得“元素”的一个名称也可以使用,项目作为键,计数作为数据。为什么不
unordered\u map
?@Everyone因为
std::map
写起来比较短,我们不知道性能是OP用例中的一个问题。@Everyone“一个相同的键”?我不明白
#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();
}