3

假设我有一个带有成员函数的类型:

class Thing {
    std::string m_name;
public:
    std::string & getName() {
        return m_name;
    }
};

并说我有一个这种类型的集合:

std::vector<Thing> things;

我想按名称保持这些东西的顺序。为此,我使用 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;
    }
}

有没有办法在不实际创建函数的情况下做与函数相同的事情thingLessThan,可能使用 std::mem_fun、std::less 等?

4

5 回答 5

4

除了 lambda 之外,您可以简单地定义一个operator<遵循严格弱排序的方法,以允许您的对象容器通过 STL 算法与默认谓词进行比较std::less

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());
于 2012-06-15T23:56:06.587 回答
2

当然。您可以使用 lambda 表达式(假设您的编译器支持它):

vector<Thing>::iterator position = lower_bound(
    things.begin(), things.end(),
    name,
   [](Thing const& thing, std::string const& name) { return thing.getName() < name; });

当然,另一种选择只是operator<为类定义,然后默认使用它,如果你不为std::lower_bound.

于 2012-06-15T23:54:37.617 回答
0

如果您不想不断地编写谓词,则可以重载operator<()和使用。std::less<T>你也可以使用 lambda 表达式,这会更好,因为operator<()它在逻辑上只与事物相连,可以以明显的方式按某种顺序排列,比如数字或字符串。

于 2012-06-15T23:55:09.283 回答
0

如果您使用 std::map,字符串将自动按字母顺序放置。如果要进一步修改排序,请创建自己的键比较函数。我认为这将是最简单的选择。

要使用 std::list,您可以在 addThing() 函数中编写自己的比较代码,该函数遍历列表查看每个字符串并将新的字符串插入到适当的位置。

于 2012-06-16T00:14:48.403 回答
0

取决于你的目的是什么?如果您只是喜欢不在一个地方声明要使用的东西的语法上的好处,请使用 lambda 表达式来创建一个匿名函数。

于 2012-06-15T23:41:21.367 回答