11

なぜないのかといつも思っていました

sort(v);// same as std::sort(v.begin(),v.end())

ずっと前に正しく思い出すと、スピーカーがこれにはコンセプトが必要だと言ったブーストコンクリップを見ましたが、理由はわかりません。ところで、私はこれを(VS 11で)試しましたが、私が見ることができるものからうまく機能します。

template <typename Container>
void sortfx(Container& c)
{
    std::sort(c.begin(),c.end());
}
int main()
{

    std::vector<double> v;
    //std::list<double> v; this causes compile errors
    v.push_back(1701);
    v.push_back(1729);
    v.push_back(74656);
    v.push_back(2063);
    sortfx(v);
    assert(std::is_sorted(begin(v),end(v)));

}

編集:Bjarne自身が概念を説明し、例として並べ替えを行います:) https://www.informit.com/articles/article.aspx?p=2080042&WT.rss_f=Article&WT.rss_a=An%20Interview%20with%20Bjarne%20Stroustrup&WT .rss_ev = a

4

6 に答える 6

10

概念を必要とするのはstd::sort(v)->std::sort(v.begin(), v.end())拡張ではなく、比較のために追加のパラメーターをとる代替ソート関数-std::sort(v.begin(), v.end(), compare)です。

呼び出しがある場合std::sort(v, compare)、実装には、それを非コンテナーの場合と区別するための概念が必要になります。std::sort(start, end)

<algorithm>ヘッダーには、この種の問題があるテンプレートがたくさんあります。

于 2012-06-24T10:06:39.777 に答える
5

新しい言語としての標準C++の学習(PDF) Stroustrup 、C /C++ユーザージャーナルから。pp43-54。1999年5月:

この場合、単純なsort(v)の方が簡単ですが、コンテナーの一部を並べ替えたい場合があるため、並べ替える内容の最初と最後を指定する方が一般的です。

それは私には理にかなっています。あなたが示したように、ラッパーを作成するのは簡単であり、ラッパーなしで使用するのはそれほど面倒ではありません。コンテナを1秒sort()取っただけでは、それだけの価値はないようです。

于 2012-06-24T02:50:23.293 に答える
3

<algorithm>関数はコンテナに対して直接機能しません。それらは、コンテナーのコンテキスト知識がなくても、イテレーターとのみ対話します。自分の目的のために短いフルレンジソート表記を使用しても害はありませんが、オブジェクトに開始/終了インターフェイスがあると想定する必要があります。これも双方向イテレータです。

于 2012-06-24T02:33:10.773 に答える
1

これについては、概念を必要とするものは何もありません。範囲は、実際にはイテレータほど複雑ではありません。

于 2012-06-24T02:37:42.427 に答える
1

コンテナのサブセットのみをソートしたい場合はどうなりますか?

私は最近、スタンドアロンではなくfor_eachメンバー関数ではない理由について、同様の質問を投稿しました。Containerすなわちv.for_each([&sum] (int i) { sum += i; });

于 2012-06-24T02:39:53.410 に答える
0

これには概念は必要ありませんが(C ++ 11の標準化中に提案されたため)、これを実装するのはかなり簡単でした。

現在のところ、これ行うには、にいくつかの追加のオーバーロード(または場合によっては明示的な特殊化)を提供しstd::sortます。もちろん、問題はそれstd::sortだけではないということです。そのため、他の多くのアルゴリズム(ほとんどすべてのアルゴリズム)でも同じことをしたいと思うことは間違いありません。

コンセプト(具体的には、メモリが機能する場合はコンセプトマップ)は、これらすべてのオーバーロード(同等のもの)を比較的集中化された方法で提供するためのかなりクリーンな方法を提供するため、これらすべてのアダプターをNか所(1か所)ではなく1か所に配置します。アルゴリズムごとに)。さらに良いことに、それらが通常の規則に準拠している限り、他のアルゴリズムでも機能します。

現在、かなりの数の人々が範囲がこれを処理する方法であると信じています-アルゴリズムは範囲で動作する必要があり、コンテナは範囲を定義する必要があります(ただし、範囲を定義する他の方法もあるはずです)。これは一般的な考え方としてはおそらく良いことですが、範囲を構成するもの、それらをどのように定義するかなどの正確な詳細については、(少なくとも私には)かなりの不一致があるように見えます。

本当にこれを探求したいのであれば、Boostには、ほとんどの標準アルゴリズム(および他の多くのアルゴリズム)の範囲ベースのバージョンを含む範囲ライブラリがすでにあります。少なくともメモリが機能する場合、これにはコンテナから範囲を作成するためのいくつかのアダプタが含まれるためsort(c)、範囲やイテレータを明示的に指定しなくても機能します。

于 2013-05-28T17:36:39.400 に答える