2015-10-25 3 views
14

私はいつもこのコードを使用することはあまり良くないことを読んでされています:サイズ

std::vector<T> my_vector; 
... 
std::sort(my_vector.begin(), my_vector.end()); 

それのようにそれを書く方が良いです:STD ::始めるが動作しますので

std::vector<T> my_vector; 
... 
std::sort(std::begin(my_vector), std::end(my_vector)); 

すべてのコンテナは通常の配列を含みます。

my_vector.size()の代替品は、通常の配列を含むすべてのコンテナで使用できますか?

+0

あなたがあなた自身のテンプレート 'サイズ()'関数を、ローリング試してみて、生のCスタイルの配列のために専門性があります。 –

+2

std :: sizeしかしC++まで17 – exs

+2

C++で 'std :: size(my_vector)'を得ることができます。今は何もありません。 –

答えて

20

実際にstd::begin(my_vector)を使用しているのは、ではありません。右足!あなたがカスタマイズポイントをピックアップしたい場合は、むしろ

using std::begin; 
using std::end; 
std::sort(begin(cont), end(cont)); 

このアプローチは、適切な版ãを見つけるために失敗した場合、フォールバックがstd::beginを使用するために、ADLを使用してbegin(cont)を見つけようとします使用したいです。

悲しいことに、std::beginのようなカスタマイズポイントのデフォルトであるstd::sizeはありません。これはstd::distance()使用する作業の種類になる:非ランダムアクセスイテレータのために、または、より一般的に典型的なノードベースのコンテナのため、しかし

std::distance(begin(cont), end(cont)); 

をいうし、格納された値からサイズを取得する要素を歩くことになる。このアプローチ。したがって、cont.size()に電話したいと思うでしょう。適切なカスタマイズポイントを定義するために比較的簡単であろう:としては、コメント欄で指摘された

namespace util { 
    template <typename C> 
    typename C::difference_type size(C const& c) { 
     return c.size(); 
    } 
    template <typename T, std::size_t N> 
    std::size_t size(T const(&)[N]) { 
     return N; 
    } 
} 

、非メンバsize()機能working paper for C++17に添加した(24.3 [イテレータの概要の下を参照します。 synoposis])。 N4280は変更を提案した論文です。この論文では、また追加された機能empty()data()を提案しています。これらの関数はすべて<iterator>で宣言されています。

C++ 17に追加されたバージョンでは、size()メンバーの返品タイプに直接decltype()が使用されています。それに加えて、constexprする関数を宣言します:

template <typename C> 
constexpr auto size(C const& c) -> decltype(c.size()) { 
    return c.size(); 
} 
+1

彼らは2つの異なる答えでなければならないので、私は2回投票することができます。 –

+0

['std :: size'はC++ 17で表示されます](http://en.cppreference.com/w/cpp/iterator/size) –