Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 避免使用辅助函数进行比较_C++_Stl_Comparison - Fatal编程技术网

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());