<algorithm>
ヘッダーは、std::equal_range()
と、それをメンバー機能として持ついくつかのコンテナを提供します。この関数で私を悩ますのは、イテレータのペアを返すことです。イテレータを開始してからイテレータを繰り返すのは面倒です。 std::begin()
とstd::end()
を使用して、C++ 11レンジベースのforループを使用できるようにしたいと考えています。私は未定義の動作でstd名前空間の結果には何も追加することを言われてきた、私はまた、あなた自身の専門分野を提供することができることが言われているのに対し、 - 今、私はstd::begin()
とstd::end()
を専門に関しては矛盾した情報を聞いたequal_range()の戻り値にstd :: beginとstd :: endを特化できますか?
std::begin()
およびstd::end()
である。
これは私が今やっているものです:
namespace std
{
template<typename Iter, typename = typename iterator_traits<Iter>::iterator_category>
Iter begin(pair<Iter, Iter> const &p)
{
return p.first;
}
template<typename Iter, typename = typename iterator_traits<Iter>::iterator_category>
Iter end(pair<Iter, Iter> const &p)
{
return p.second;
}
}
そして、これが作業を行います。http://ideone.com/wHVfkh
しかし、私は疑問に思って、これを行うに欠点は何ですか?これを行うより良い方法はありますか?それは、特に断らない限り、名前空間std
内std
または名前空間 にする名前空間に宣言または定義を追加した場合、C++プログラムの
ユーザー定義型が関与している場合、「picky」はどのように許可されるのですか?このペアには、unique_ptrsのコンテナをユーザ定義型に反復するイテレータが含まれています。 –
あなたの定義は、書かれているように、ユーザ定義の型は言及していません。これらのテンプレートは最終的にユーザー定義型でインスタンス化されるかもしれませんが、それは無関係です。 –
いずれの場合でも、「ユーザー定義型に依存する」エスケープハッチは、テンプレートの特殊化にのみ適用されます。あなたはそうではありません。それらは主要な関数テンプレートです。同じ名前の他の関数テンプレートに過度の負荷がかかります。 –