C++ 关于map::erase和map::count
关于map::count()和map::erase()的使用,我有一个简单的问题。我将它们与std::string一起使用,但想知道是否需要使用string::c_str()。例如,“我的代码”当前显示为:C++ 关于map::erase和map::count,c++,string,dictionary,C++,String,Dictionary,关于map::count()和map::erase()的使用,我有一个简单的问题。我将它们与std::string一起使用,但想知道是否需要使用string::c_str()。例如,“我的代码”当前显示为: void Person::removeFriend(std::string first, std::string last){ std::string name = (first + last); //checks to ensure the friend exists in
void Person::removeFriend(std::string first, std::string last){
std::string name = (first + last);
//checks to ensure the friend exists in the user's friend list
if (_friends.count(name) == 1){
_friends.erase(name);
}
}
那么我的问题是,它是否真的是这样的:
void Person::removeFriend(std::string first, std::string last){
std::string name = (first + last);
//checks to ensure the friend exists in the user's friend list
if (_friends.count(name.c_str()) == 1){
_friends.erase(name.c_str());
}
}
另外,我想这也适用于map::insert()。我只从使用std::string打开文件中知道这个用法。任何和所有的建议都是非常感谢提前 不,没有理由在这里使用
c_str
。在使用擦除之前,不需要检查是否存在。您的功能可以简单如下:
void Person::removeFriend(const std::string& first, const std::string& last){
std::string name = (first + last);
_friends.erase(name);
}
。。。甚至:
void Person::removeFriend(const std::string& first, const std::string& last){
_friends.erase(first + last);
}
不,没有理由在这里使用c_str
。在使用擦除之前,不需要检查是否存在。您的功能可以简单如下:
void Person::removeFriend(const std::string& first, const std::string& last){
std::string name = (first + last);
_friends.erase(name);
}
。。。甚至:
void Person::removeFriend(const std::string& first, const std::string& last){
_friends.erase(first + last);
}
std::map
有一个只需按键的重载
size_type erase( const key_type& key );
您可以简单地使用:
std::string name = (first + last);
_friends.erase(name);
std::map
有一个只需按键的重载
size_type erase( const key_type& key );
您可以简单地使用:
std::string name = (first + last);
_friends.erase(name);
文件流需要c_str
的唯一原因是,它们过去只接受const char*
,如果给定std::string
,就不会编译。假设您的std::map
键首先定义为std::string
,那么可以将std::string
值传递给count()
和擦除()。顺便说一句,使用count()
并不是测试是否存在的最佳方法,您可以使用find()
。它向第一个匹配键返回一个迭代器
,然后您可以使用该迭代器erase()
该特定项。如果按键值执行erase()
,则必须再次搜索该键值,这是您事先已找到的,因此第二次搜索是多余的,可能会浪费时间,具体取决于地图中的项目数。我不确定您为什么要费心于计数
或查找
。如果你想删除它,只要删除
。Fred的意思是如果你按键值删除()
,它会删除找到的项,否则它不会删除任何内容,也不会抛出错误。该版本的erase()
返回实际删除的项目数。因此,count(name)
和iter=find(name);擦除(iter)单独使用erase(name)
时,code>和都是多余的。@CreasyBear,仅供参考,所有标准库通常都有。文件流需要c_str
的唯一原因是,它们过去只接受const char*
,如果给定std::string
,则不会编译。假设您的std::map
键首先定义为std::string
,则可以将std::string
值传递给count()
和erase()
。顺便说一句,使用count()
并不是测试是否存在的最佳方法,您可以使用find()
。它向第一个匹配键返回一个迭代器
,然后您可以使用该迭代器erase()
该特定项。如果按键值执行erase()
,则必须再次搜索该键值,这是您事先已找到的,因此第二次搜索是多余的,可能会浪费时间,具体取决于地图中的项目数。我不确定您为什么要费心于计数
或查找
。如果你想删除它,只要删除
。Fred的意思是如果你按键值删除()
,它会删除找到的项,否则它不会删除任何内容,也不会抛出错误。该版本的erase()
返回实际删除的项目数。因此,count(name)
和iter=find(name);擦除(iter)当使用erase(name)
本身时,code>都是多余的。@CreasyBear,仅供参考,通常所有标准库都有。