我正在尝试构建一个函数,该函数将包含自定义类对象的字符串和向量作为参数,并返回具有与参数字符串相同的.name字符串成员的向量元素。我编写的函数如下所示,只要我不尝试在不存在的项目上使用游戏“获取对象”功能。如果我这样做,程序崩溃与标题中的运行时错误。我不确定导致此错误的是什么,有人可以指出错误吗?我已经尝试确保string_to_item中的所有路径都返回一个项类型但是没有用。另一件有趣的事情是,break实际上永远不会导致for循环停止,它只会持续到最后。
items string_to_item( string item_name, const vector<items>& item_container ) {
if ( item_container.size() > 0 ) {
for (int i = 0; i < item_container.size(); ++i) {
if ( item_container[i].name == item_name ) {
return item_container[i];
break;
}
else
cout << "No such item found";
}
}
else
return items("null");
if ( item_container.size() == 0)
cout << "no elements in vector ( get_item )";
}
调试器调用堆栈在崩溃时指向此:
KernelBase.dll!74b01d4d()
调用此函数和涉及的类的其他函数是:
void get(const vector<string>& input_tokens, vector<items>& global_item_list) {
player_inventory.get_item( string_to_item( input_tokens[1], global_item_list) );
cout << "You have picked up a " << input_tokens[1] << ".\n\n";
remove_from_world( string_to_item( input_tokens[1], global_item_list), global_item_list);
}
void inventory::get_item( items name ) {
contents.push_back(name);
}
struct items {
string name;
char type;
string description;
items() {
name = " ";
type = ' ';
description = " ";
}
items( string n )
: name(n) {}
items( string n, char t, string d )
: name(n), type(t), description(d) {}
bool operator()( const items& one, const items& two ) const {
return one.name.compare(two.name) < 0;
}
};
void remove_from_world( items full_def, vector<items>& global_item_list ) {
vector<items>::iterator it = find( global_item_list.begin(), global_item_list.end(),full_def);
int i = distance(global_item_list.begin(), it);
if (it != global_item_list.end())
global_item_list.erase(global_item_list.begin() + i);
else {
cout << "remove from world failure";
return;
}
}
感谢。
答案 0 :(得分:3)
我没有调试你的代码,因为你不应该编写像这样的循环,就像在容器中查找项目一样简单。使用<algorithm>
中的算法,您的问题很可能会消失。
由于您正在寻找具有特定items
的{{1}}对象,因此您需要使用std::find_if
。您提供的谓词将完成将name
与item_name
进行比较的工作。
使用C ++ 11,这非常简单,编写一个可以完成工作的lambda表达式。
items::name
如果您正在使用较旧的编译器,那么任务就会变得更加冗长。最简单的选择是创建一个存储器,该存储器存储对items string_to_item( string item_name, const vector<items>& item_container )
{
auto result = std::find_if(item_container.begin(), item_container.end(),
[&](items const& it) {
return it.name == item_name;
});
if(result == item_container.end()) {
if(item_container.size() == 0) {
std::cout << "no elements in vector ( get_item )";
}
return items("null");
}
return *result;
}
的引用并重载item_name
以执行比较。这正是编译器在上面的C ++ 11版本中幕后所做的事情。
operator()