2015-12-07 13 views
10

Đối với std :: priority_queue tôi giả định rằng tham số mẫu đầu tiên được chỉ định loại và tham số thứ hai phải là vùng chứa loại đó. Ví dụ:Việc sử dụng thông số mẫu đầu tiên trong priority_queue

priority_queue<int, vector<int>> someQueue; 

Tuy nhiên, đoạn mã sau biên dịch và có vẻ chạy tốt:

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; 
} 

Sản phẩm mã trên không hợp lệ (ví dụ: cho UB)?

Nếu giá trị hợp lệ - thông số mẫu đầu tiên (ví dụ: someClass) được sử dụng trong priority_queue là gì.

+2

Tìm tốt. Nó cho phép bạn viết 'priority_queue ', tôi cho là vậy. Nó không được sử dụng ở bất cứ nơi nào khác, và tôi không thấy bất kỳ yêu cầu nào về nó trong tiêu chuẩn. –

+0

Nếu bạn thấy, ví dụ: [this 'std :: priority_queue' reference] (http://en.cppreference.com/w/cpp/container/priority_queue) bạn sẽ thấy rằng các kiểu được sử dụng cho dữ liệu được lưu trữ thực sự sử dụng các kiểu từ vùng chứa, chứ không phải đã cung cấp đối số mẫu đầu tiên. Nếu nó được cho là như vậy và những gì các đặc điểm kỹ thuật nói rằng tôi không biết. –

+0

Tham số firsrt là kiểu phần tử trong tham số thứ hai. Vì vậy, tôi nghĩ rằng điều này 'priority_queue > pq;' là sai. xin vui lòng tham khảo: http: //www.cplusplus.com/reference/queue/priority_queue/ – BlackMamba

Trả lời

3

tươi bình chọn vào giấy làm việc tại Jacksonville, qua LWG issue 2566:

Mẫu đầu tiên tham số T của adapter chứa sẽ biểu thị cùng loại như Container::value_type.

Viết kết quả phù hợp với hành vi không xác định.

+0

Cảm ơn bạn đã cập nhật :) – 4386427

3

Trong đặc tả C++ 11, phần khoảng std::priority_queue là §23.6.4. Trong đó, đối số mẫu đầu tiên chỉ đơn giản là loại mặc định được sử dụng cho vùng chứa và không có gì khác.

Loại giá trị thực được lấy từ vùng chứa.

Các lớp được khai báo là

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

[Trích từ this reference]

Đó chương trình khai như thế nào, khi nào và nơi đối số mẫu đầu tiên được sử dụng.

+1

Vì vậy tham số đầu tiên chỉ được sử dụng khi tôi không chỉ định vùng chứa - chính là nó? – 4386427

+0

@StillLearning Đúng vậy. –

+5

Với tôi, điều đó vi phạm nguyên tắc của sự ngạc nhiên nhất. – juanchopanza

Các vấn đề liên quan