2014-09-22 11 views
6

C++ có tương đương với số set.pop() của python không? Tôi đã xem tài liệu cho unordered_set s here, nhưng dường như không có cách nào để 1. Truy cập phần tử tùy ý và/hoặc 2. Truy cập + xóa phần tử tùy ý (popping).Tương đương với tập hợp python.pop() cho các bộ không có thứ tự của C++

+0

Vì nó là * không theo thứ tự *, không phải là bắt đầu() và kết thúc() "tùy ý" theo định nghĩa? Python có lẽ đang làm một cái gì đó tương tự dưới bìa. – swstephe

+0

True ... Tôi có thể chỉ cần gắn bó với việc thực hiện chương trình của tôi. – hlin117

Trả lời

2

Lưu ý rằng C++ thư viện giữa các ý kiến ​​cố ý thiết kế sao cho các chi tiết kỹ thuật khác nhau chứa không bao gồm một "nhận được và loại bỏ" chức năng: ví dụ: cho vector, bạn có back() trả về giá trị ở cuối và bạn có pop_back() sẽ xóa giá trị ở cuối, nhưng không trả lại giá trị đó.

Lý do cho điều này cũng có thể là nội dung của một câu hỏi riêng biệt. Vì vậy, những gì bạn thực sự muốn là một phương pháp để có được một phần tử (ví dụ: begin() như được đề xuất trong các ý kiến), và sau đó để loại bỏ nó một khi bạn đã nhận được nó (ví dụ: erase(iterator) như đã đề cập trong câu trả lời khác).

+0

bất kỳ tham chiếu nào về các lý do của ý định đó theo tiêu chuẩn? –

7

Bạn có thể bật các yếu tố đầu tiên

auto i = *set.begin(); 
set.erase(set.begin()); 

hoặc nếu bạn quá quan tâm về trật tự nội bộ thực hiện xác định của xô (gợi ý: bạn có lẽ không nên có), bạn có thể loại bỏ một yếu tố ngẫu nhiên với một cái gì đó giống như

#include <unordered_set> 
#include <iostream> 
#include <random> 

int main() 
{ 
    std::unordered_set<int> set{0, 1, 2, 3, 4, 5}; 
    std::default_random_engine ran{std::random_device{}()}; 

    auto it = set.begin(); 
    std::advance(it, std::uniform_int_distribution<>{0, set.size() - 1}(ran)); 

    std::cout << *it << '\n'; 
    set.erase(it); 
} 

trên đây không phải là đặc biệt hiệu quả tuy nhiên và bạn có thể được tốt hơn bằng cách điền vào một std::vector, loại bỏ các bản sao, ngẫu nhiên trình tự, sau đó chỉ cần pop_back ing các elemen ts.

#include <algorithm> 
#include <vector> 
#include <iostream> 
#include <random> 

int main() 
{ 
    std::vector<int> vec{0, 1, 2, 3, 3, 4, 5, 5}; 
    std::sort(vec.begin(), vec.end()); 
    vec.erase(std::unique(vec.begin(), vec.end()), vec.end()); 

    std::shuffle(
    vec.begin(), 
    vec.end(), 
    std::default_random_engine{std::random_device{}()} 
); 

    while (!vec.empty()) { 
    std::cout << vec.back() << '\n'; 
    vec.pop_back(); 
    } 
} 

(n.b. tùy theo nền tảng của bạn random_device có thể không phải là hạt giống rất tốt).

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