我想要一种搜索我的矢量的方法。从用户输入中查找匹配的字符串。然后使用第二个代码块输出。
这是我的代码:
void Ingredient::database(Ingredient &object){
Ingredient item1("White Cap", "Weakness to Frost", "Fortify Heavy Armor", "Restore Magicka", "Ravage Magicka");
Ingredient item2("Wisp Wrappings", "Restore Stamina", "Fortify Destruction", "Fortify Carry Weight", "Resist Magic");
Ingredient item3("Yellow Mountain Flower", "Resist Poison", "Fortify Restoration", "Fortify Health", "Damage Stamina Regen");
std::vector< Ingredient* > satchel;
satchel.push_back(&item1);
satchel.push_back(&item2);
satchel.push_back(&item3);
}
这是我希望显示的输出:
void Ingredient::displayItems(){
std::cout << '\n';
std::cout << "Ingredient: " << iName << '\n';
std::cout << "Primary Effect: " << pAttr << '\n';
std::cout << "Secondary Effect: " << sAttr << '\n';
std::cout << "Tertiary Effect: " << tAttr << '\n';
std::cout << "Quaternary Effect: " << qAttr << '\n';
}
变量
Ingredient::Ingredient(){iName = "", pAttr = "", sAttr = "", tAttr = "", qAttr = "";}
Ingredient::Ingredient(std::string name, std::string first, std::string second, std::string third, std::string fourth)
{
iName = name;
pAttr = first;
sAttr = second;
tAttr = third;
qAttr = fourth;
}
类
class Ingredient{
public:
Ingredient();
Ingredient(std::string name, std::string first, std::string second, std::string third, std::string fourth);
void displayItems();
void database(Ingredient &object);
private:
std::string iName, pAttr, sAttr, tAttr, qAttr;
};
答案 0 :(得分:0)
一些事情。你可能不希望你的成分数据库在成分类中(似乎很奇怪,一个对象将包含一个自身副本的数据库..通常,显然有时候这是有道理的)。此外,如果您需要保留指针的副本,您至少需要unique_ptr,但在这种情况下,对象本身的副本将会执行(此处不显示继承,否则您可能需要使用指向基类对象的指针)。
这是我在ideone上编译的一个例子,只按成分名称实现了矢量搜索,但如果需要,你应该可以将其推广到其他字段。至少它显示了你想要做的一个例子。
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
class Ingredient
{
public:
Ingredient() = default;
Ingredient(std::string name, std::string first, std::string second, std::string third, std::string fourth) :
iName(std::move(name)),
pAttr(std::move(first)),
sAttr(std::move(second)),
tAttr(std::move(third)),
qAttr(std::move(fourth))
{
}
const std::string& getName() const
{
return iName;
}
void displayIngredient() const
{
std::cout << '\n';
std::cout << "Ingredient: " << iName << '\n';
std::cout << "Primary Effect: " << pAttr << '\n';
std::cout << "Secondary Effect: " << sAttr << '\n';
std::cout << "Tertiary Effect: " << tAttr << '\n';
std::cout << "Quaternary Effect: " << qAttr << '\n';
}
private:
std::string iName;
std::string pAttr;
std::string sAttr;
std::string tAttr;
std::string qAttr;
};
int main()
{
std::vector<Ingredient> satchel;
satchel.reserve(3);
satchel.emplace_back("White Cap", "Weakness to Frost", "Fortify Heavy Armor", "Restore Magicka", "Ravage Magicka");
satchel.emplace_back("Wisp Wrappings", "Restore Stamina", "Fortify Destruction", "Fortify Carry Weight", "Resist Magic");
satchel.emplace_back("Yellow Mountain Flower", "Resist Poison", "Fortify Restoration", "Fortify Health", "Damage Stamina Regen");
const auto ingredientFoundByName = std::find_if(satchel.begin(), satchel.end(),
[&](const Ingredient& currIngredient)
{
return currIngredient.getName() == "Yellow Mountain Flower";
});
if (ingredientFoundByName != satchel.end())
{
ingredientFoundByName->displayIngredient();
}
else
{
std::cout << "Could not find ingredient\n";
}
return EXIT_SUCCESS;
}
输出:
Ingredient: Yellow Mountain Flower
Primary Effect: Resist Poison
Secondary Effect: Fortify Restoration
Tertiary Effect: Fortify Health
Quaternary Effect: Damage Stamina Regen