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

ラムダ以外に、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

もちろん。ラムダ式を使用できます(コンパイラーがそれをサポートしていると仮定します):

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

あなたの目的に応じて?1つの場所で使用するものを宣言しないという構文上の優れた点が気に入った場合は、ラムダ式を使用して無名関数を作成してください。

于 2012-06-15T23:41:21.367 に答える
0

述語を継続的に記述したくない場合は、オーバーロードoperator<()して使用できます。std::less<T>また、ラムダ式を使用することもできます。これは、operator<()論理的には物とのみ接続されているため、数値や文字列などの明白な方法で順序付けできるため、はるかに優れています。

于 2012-06-15T23:55:09.283 に答える
0

std :: mapを使用すると、文字列は自動的にアルファベット順に配置されます。順序をさらに変更する場合は、独自のキー比較関数を作成してください。これが最も簡単なオプションだと思います。

std :: listを使用するには、addThing()関数内に独自の比較コードを記述して、リストを調べて各文字列を調べ、新しい文字列を適切な場所に挿入します。

于 2012-06-16T00:14:48.403 に答える