gpt4 book ai didi

c++ - 使用 std::find 从 vector 中选择一个项目

转载 作者:太空狗 更新时间:2023-10-29 21:47:24 26 4
gpt4 key购买 nike

我在使用基于 vector 的库存系统时遇到问题。我能够列出库存中的项目,但无法允许访问用户选择的项目。这是代码:

struct aItem
{
string itemName;
int damage;

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

int main()
{
int selection = 0;


aItem healingPotion;
healingPotion.itemName = "Healing Potion";
healingPotion.damage= 6;

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

aItem testPotion;
testPotion.itemName = "I R NOT HERE";
testPotion.damage = 9001;
int choice = 0;
vector<aItem> inventory;
inventory.push_back(healingPotion);
inventory.push_back(healingPotion);
inventory.push_back(healingPotion);
inventory.push_back(fireballPotion);

cout << "This is a test game to use inventory items. Woo!" << endl;
cout << "You're an injured fighter in a fight- real original, I know." << endl;
cout << "1) Use an Item. 2) ...USE AN ITEM." << endl;

switch (selection)
{
case 1:
cout << "Which item would you like to use?" << endl;
int a = 1;
for( vector<aItem>::size_type index = 0; index < inventory.size(); index++ )
{

cout << "Item " << a << ": " << inventory[index].itemName << endl;
a+= 1;
}
cout << "MAKE YOUR CHOICE." << endl << "Choice: ";

cin >> choice;

^^^^这条线以上的一切都有效。我假设我的问题是 if 语句,但我无法弄清楚我的语法哪里出错了,或者是否有更好的方法来完成我正在做的事情。

        if (find(inventory.begin(), inventory.at(choice), healingPotion.itemName) != inventory.end())
cout << "You used a healing potion!";
else
cout << "FIERY BALLS OF JOY!";
break;

case 2:
cout << "Such a jerk, you are." << endl;
break;

}

编辑:我想我没有正确表达这一点。我需要玩家的选择来影响显示的消息。这是第一个片段的示例输出:

Item 1: Healing Potion
Item 2: Healing Potion
Item 3: Healing Potion
Item 4: Potion of Fiery Balls

MAKE YOUR CHOICE.
Choice:

从那里,玩家可以输入 1-4,我想要的是将数字(减 1,以反射(reflect)从零开始的 vector )传递给 find,然后确定(在这个小例如)如果元素栏[选择 - 1] 中的元素是治疗药水。如果是这样,显示“你使用了治疗药水!”如果不是,则显示“欢乐的火球”。

最佳答案

三个问题。

一,你的运营商应该声明为:

bool operator==(const aItem& other) const

二、在这段代码中:

find(inventory.begin(), inventory.at(choice), healingPotion) != inventory.end())

您不是在搜索从 begin()end() 的整个 vector ——您只是在从 begin() 搜索> 到 at(choice),其中 at(choice) 指向搜索集的最后一个。所以你要么应该这样做:

find(&inventory.at(0), &inventory.at(choice), healingPotion) != &inventory.at(choice))

或者这个...

find(inventory.begin(), inventory.end(), healingPotion.itemName) != inventory.end())

编辑 第三,您正在尝试将苹果与橙子进行比较。您正在搜索 aItem 对象的 vector 以查找匹配的 aItem 对象,但是您发送给 find 的参数不是 aItem 对象,它是 aItem 数据成员之一。

您应该搜索匹配项,如下所示:

find( inventory.begin(), inventory.end(), healingPotion ) != inventory.end() )
^^^^^^^^

在 C++03 中你可以提供一个仿函数:

#include <functional>
struct match_name : public std::unary_function<aItem, bool>
{
match_name(const string& test) : test_(test) {}
bool operator()(const aItem& rhs) const
{
return rhs.itemName == test_;
}
private:
std::string test_;
};

... 然后使用 find_if 搜索匹配项:

find_if( inventory.begin(), inventory.end(), match_name(healingPotion.itemName) ) // ...

在 C++11 中,您可以使用闭包来简化这一困惑局面:

string test = healingPotion.itemName;
if( find_if( inventory.begin(), inventory.end(), [&test](const aItem& rhs)
{
return test == rhs.itemName;
}) == inventory.end() )
{
// not found
}

关于c++ - 使用 std::find 从 vector 中选择一个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13349637/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com