2

我正在尝试使用矢量实现创建库存系统,但我似乎遇到了一些麻烦。我在使用我制作的结构时遇到了问题。注意:这实际上不在游戏代码中,这是我用来测试我对向量和结构的知识的单独解决方案!

struct aItem
{
    string  itemName;
    int     damage;
};

int main()
{
    aItem healingPotion;
    healingPotion.itemName = "Healing Potion";
    healingPotion.damage= 6;

    aItem fireballPotion;
    fireballPotion.itemName = "Potion of Fiery Balls";
    fireballPotion.damage = -2;

    vector<aItem> inventory;
    inventory.push_back(healingPotion);
    inventory.push_back(healingPotion);
    inventory.push_back(healingPotion);
    inventory.push_back(fireballPotion);

    if(find(inventory.begin(), inventory.end(), fireballPotion) != inventory.end())
                {
                        cout << "Found";
                }

    system("PAUSE");
    return 0;
}

前面的代码给了我以下错误:

1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\xutility(3186): error C2678: binary '==' : no operator found which take a left-hand operand of type 'aItem' (或者没有可接受的转换)

错误还有更多,如果您需要它,请告诉我。我敢打赌这是一件小而愚蠢的事情,但我已经敲了两个多小时。提前致谢!

4

3 回答 3

5

find寻找与向量中的项目相等的东西。您说您想使用字符串进行搜索,但您还没有为此编写代码;它试图比较整个结构。而且您还没有编写代码来比较整个结构,所以它会给您一个错误。

最简单的解决方案是使用显式循环而不是find.

如果您想find按字符串处理,请使用find_if变体并编写一个查看字符串的谓词函数。或者,如果您想find按整个结构进行处理,您可以operator ==在结构上定义一个比较itemName和的结构damage

或者您也可以考虑使用maporunordered_map数据结构而不是vector. 地图容器设计用于使用键(例如字符串)进行快速查找。

于 2012-11-09T18:48:45.440 回答
3

find方法不知道如何比较两个aItem对象是否相等。您需要==在结构定义中定义运算符,如下所示:

bool operator==(aItem other)
{
    if (itemName == other.itemName && damage == other.damage)
        return true;
    else
        return false;
}

这将允许find确定两个aItem对象是否相等,这是算法工作所必需的。

于 2012-11-09T18:55:15.197 回答
0

尝试类似:

#include <iostream>
#include <vector>
using namespace std;
struct item {
    item(string const name,int const damage):name_(name),damage_(damage) {

    }
    string name_;
    int damage_;
};
int main(int argc, char** argv) {
    vector<item *> items;
    item healingPostion("cure light",-10);
    item fireballPostion("fireball",10);
    items.push_back(&healingPostion);
    items.push_back(&fireballPostion);
    if(find(items.begin(), items.end(), &fireballPostion) != items.end()) {
        cout << "Found";
    }
    return 0;
}
于 2012-11-09T23:36:41.893 回答