2015-12-07 2 views
10

std :: priority_queueでは、最初のテンプレートパラメータが型を指定し、2番目がその型のコンテナであると仮定しました。例:priority_queueの最初のテンプレートパラメータの使用方法

priority_queue<int, vector<int>> someQueue; 

ただし、次のコードはコンパイルされ、正常に動作するようです:

class SomeClass 
{ 
}; 

int main() 
{ 
    priority_queue <SomeClass, vector<int>> pq; 
    int x = 9; 
    pq.push(x); 
    int t = pq.top(); 
    cout << t << endl; 
    pq.pop(); 
    return 0; 
} 

は、上記のコード無効(すなわちUBを与える)ですか?

有効な場合は、priority_queueに使用される最初のテンプレートパラメータ(つまり、someClass)は何ですか。

+2

ニースが見つかりました。 'priority_queue 'と書くことができます。他の場所では使用されていませんが、標準ではそれに関する要件はありません。 –

+0

[この 'std :: priority_queue'リファレンス](http://en.cppreference.com/w/cpp/container/priority_queue)では、格納されたデータに使用される型は実際にはコンテナの型を使用していますが、最初のテンプレート引数を提供しました。それがそうでなければならないと仕様が何を言っているのかわからない。 –

+0

firsrtパラメータは、2番目のパラメータの要素タイプです。だから私はこの 'priority_queue > pq;'が間違っていると思います。 http://www.cplusplus.com/reference/queue/priority_queue/ – BlackMamba

答えて

3

たてはLWG issue 2566介して、ジャクソンビルで働いて紙に投票:

を容器アダプタの最初のテンプレートパラメータTContainer::value_typeとして 同じタイプを意味するものとします。

したがって、std::priority_queue<SomeClass, std::vector<int>>を書き込むと、定義されていない動作が発生します。

+0

更新ありがとうございます:) – 4386427

3

C++ 11仕様では、約std::priority_queueのセクションは§23.6.4です。最初のテンプレート引数は、単にコンテナに使用されるデフォルトの型であり、それ以外は何もありません。

実際の値のタイプはコンテナから取得されます。

クラスは[this referenceから撮影]

template< 
    class T, 
    class Container = std::vector<T>, 
    class Compare = std::less<typename Container::value_type> 
> class priority_queue; 

その宣言表示方法、および最初のテンプレート引数が使用されるように宣言されます。

+1

最初のパラメータは、コンテナを自分で指定していない場合にのみ使用されます。 – 4386427

+0

@StillLearningはい、正しいです。 –

+5

私には、少なくとも驚きの原則に違反しています。 – juanchopanza

関連する問題