C++ 避免使用辅助函数进行比较
假设我有一个带有成员函数的类型:C++ 避免使用辅助函数进行比较,c++,stl,comparison,C++,Stl,Comparison,假设我有一个带有成员函数的类型: class Thing { std::string m_name; public: std::string & getName() { return m_name; } }; 假设我有一个这样的集合: std::vector<Thing> things; std::向量事物; 我想按名字把事情安排得井井有条。为此,我使用std::lower_bound来确定将其放在何处: bool thingLe
class Thing {
std::string m_name;
public:
std::string & getName() {
return m_name;
}
};
假设我有一个这样的集合:
std::vector<Thing> things;
std::向量事物;
我想按名字把事情安排得井井有条。为此,我使用std::lower_bound来确定将其放在何处:
bool thingLessThan(Thing const& thing, std::string const& name) {
return thing.getName() < name;
}
void addThing(std::string const& name) {
vector<Thing>::iterator position = lower_bound(
things.begin(), things.end(),
name,
thingLessThan);
if (position == things.end() || position->getName() != name) {
position = things.insert(position, Thing());
position->getName() = name;
}
}
bool thingLessThan(Thing const&Thing,std::string const&name){
返回thing.getName()getName()!=name){
位置=事物。插入(位置,事物());
位置->获取名称()=名称;
}
}
有没有一种方法可以在不实际创建函数的情况下执行与thingLessThan函数相同的操作,比如使用std::mem\u-fun、std::less等,这取决于您的目的是什么?如果您只是喜欢不在一个地方声明要使用的内容的语法精确性,请使用lambda表达式创建匿名函数。当然。可以使用lambda表达式(假设编译器支持):
vector::迭代器位置=下界(
things.begin(),things.end(),
名称
[](Thing const&Thing,std::string const&name){return Thing.getName()
当然,另一种选择是只定义
操作符您可以重载操作符而不是lambda。您只需定义操作符如果使用std::map,字符串将自动按字母顺序排列。如果要进一步修改排序,请创建自己的键比较函数。我认为这是最简单的选择
要使用std::list,您可以在addThing()函数中编写自己的比较代码,该函数遍历列表查看每个字符串,并在适当的位置插入新字符串。您可以使用lambda。它直接内联到函数调用中。您也可以使用一个容器来自动排序其元素,但是您需要定义operator,或者假设这是我们在C++11之前所能做的最好的。我迫不及待地要等到g++正式100%兼容C++11。对于一些移动语义和lambdas,我真的很伤心。@TravisParks您不需要g++来支持100%的C++11。它甚至不支持所有的C++-98。但它已经支持移动语义和lambdas。所以,无论是什么阻碍了你,都不是G++我只是不想在命令行中指定任何内容。我会一直等到默认情况下一切都打开。
vector<Thing>::iterator position = lower_bound(
things.begin(), things.end(),
name,
[](Thing const& thing, std::string const& name) { return thing.getName() < name; });
class whatever
{
public:
bool operator<(const whatever& rhs) const { return x < rhs.x; }
private:
int x;
};
std::vector<whatever> v;
std::sort(v.begin(), v.end());