2014-09-22 15 views
6

C++, python'un set.pop() mu? unordered_set s here belgelerine bakıyordum, ancak bir yol görünmüyor. 1. Bir keyfi öğeye erişin ve/veya 2. Erişim + rasgele bir öğeyi kaldırın (haşhaş).C++ 's sırasız setleri için python's set.pop() ile eşdeğer

+0

* Sırasız * olduğundan, başlayarak() ve bitiş() "isteğe göre" değil? Python muhtemelen kapakların altında benzer bir şey yapıyordur. – swstephe

+0

Doğru ... Programımın uygulanmasına bağlı kalırım. – hlin117

cevap

2

Not vector için, sonunda değeri döndüren back() var ve sonunda değeri kaldıran ancak geri döndürmeyen pop_back() var. Bunun nedenleri ayrı bir sorunun içeriği olabilir.

Yani gerçekten istediğiniz şey, bir öğenin (örneğin, yorumlarda önerildiği şekilde begin()) elde edilmesi ve daha sonra onu aldıktan sonra kaldırmak için bir yöntemdir (örneğin, diğer yanıtta belirtildiği gibi erase(iterator)). (: Muhtemelen olmamalı ipucu), bir kaldırabilir Eğer kovalar uygulanması tanımlı iç sipariş konusunda aşırı kaygı duyuyorsanız

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

veya

+0

Standartların bu niyetine dair herhangi bir referans mı? –

7

İlk eleman pop ya yukarıdaki

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

gibi bir şeyle rastgele eleman Ancak özellikle verimli değildir ve, çiftleri kaldırarak, bir std::vector doldurma düzeni randomizing ve sadece pop_back Elemen ing tarafından daha iyi olabilir 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(); 
    } 
} 

(platformunuza random_device bağlı N.B. çok iyi bir tohum olmayabilir).