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): エラー C2678: バイナリ '==' : タイプ 'aItem' の左側のオペランドを取る演算子が見つかりません (または受け入れ可能な変換がない)

エラーには他にもあります。必要な場合はお知らせください。小さくてばかげたものだと思いますが、私は2時間以上それを叩いてきました. 前もって感謝します!

4

3 に答える 3

5

findベクトル内の項目と等しいものを探します。文字列を使用して検索したいと言っていますが、そのためのコードを書いていません。構造体全体を比較しようとしています。また、構造体全体を比較するコードを記述していないため、エラーが発生しています。

最も簡単な解決策は、代わりに明示的なループを使用することですfind

find文字列で物事を処理したい場合は、find_ifバリアントを使用して、文字列を見る述語関数を記述します。findまたは、構造体全体で物事を処理したい場合は、 と の両方をoperator ==比較する構造体に を定義できます。itemNamedamage

mapまたは、 の代わりにまたはのunordered_mapデータ構造を使用することも検討してくださいvector。マップ コンテナーは、キー (文字列など) を使用して高速に検索できるように設計されています。

于 2012-11-09T18:48:45.440 に答える
3

このメソッドは、2 つのオブジェクトが等しいfindかどうかを比較する方法を知りません。次のように、構造体定義で演算子aItemを定義する必要があります。==

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

これfindにより、2 つの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 に答える