Czy C++ ma odpowiednik pytfona set.pop()
? Przeglądałem dokumentację dla unordered_set
s here, ale nie wydaje się, że istnieje sposób na 1. Dostęp do dowolnego elementu i/lub 2. Dostęp + usunięcie dowolnego elementu (popping).Równoważna z pythoniem set.pop() dla nieuporządkowanych zbiorów języka C++
Odpowiedz
Zauważmy, że C++ Standardowa biblioteka jest celowo zaprojektowany tak, że różne specyfikacje kontenerów nie zawierają „GET i usuwania” funkcję: na przykład dla vector
, masz back()
, który zwraca wartość na końcu, i masz pop_back()
, który usuwa wartość na końcu, ale nie zwraca go.
Przyczyną tego może być treść osobnego pytania.
Tak więc, czego faktycznie potrzebujesz, to metoda uzyskania elementu (np. begin()
zgodnie z sugestiami w komentarzach), a następnie usunięcie go po uzyskaniu go (np. erase(iterator)
, jak wspomniano w drugiej odpowiedzi).
wszelkie odniesienia do przyczyn tego zamiaru według normy? –
Odpowiednikiem jest unordered_set.erase Myślę, że. http://www.cplusplus.com/reference/unordered_set/unordered_set/erase/
Można albo pop pierwszy element
auto i = *set.begin();
set.erase(set.begin());
lub jeśli jesteś zbyt zaniepokojeni wewnętrznego uporządkowania realizacji zdefiniowanej z wiader (podpowiedź: prawdopodobnie nie powinno być), można usunąć element losowy z czymś
#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);
}
Powyższe nie jest jednak szczególnie efektywny i może być lepiej przez wypełnienie std::vector
, usuwanie duplikatów, losowanie kolejności, a potem po prostu pop_back
ing z 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();
}
}
(nb zależności od używanej platformy random_device
nie może być bardzo dobre nasienie).
- 1. Data.Foldable dla nieuporządkowanych kontenerów
- 2. Funkcja autouzupełniania z pythoniem Dict
- 3. wsparcie dla języka C++ 11?
- 4. C++ 11 Równoważna do Boost.Format
- 5. UML dla języka programowania C
- 6. RDMS dla początkującego języka C?
- 7. Funkcja równoważna dla xticks dla obiektu AxesSubplot
- 8. Co to jest najpopularniejsza biblioteka ogólnych zbiorów danych dla C?
- 9. Metoda równoważna z odpowiednikiem -respondsToSelector:
- 10. Interfejs API wyszukiwarki Google dla języka C#
- 11. C#: uzyskać litery alfabetu dla języka skandynawskiego?
- 12. Tryb Emacsa dla języka w stylu c
- 13. Jaśmin dla języka C# i/lub Java
- 14. Rozwiązanie dla języka tureckiego-I w C++
- 15. Dobra biblioteka programowania liniowego dla języka C#?
- 16. Najlepszy analizator składni dla języka C#?
- 17. C# bardziej skuteczny sposób porównywania dwóch zbiorów
- 18. SSE _mm_movemask_epi8 Równoważna metoda dla ARM NEON
- 19. Java Równoważna z funkcją iif
- 20. Lepsze rozwiązanie dla zagnieżdżonych zbiorów backbone.js
- 21. wnioski moduł powrotny json z elementów nieuporządkowanych
- 22. Równoważna struktura pętli zagnieżdżonej z Itertools
- 23. Bezpłatne IDE języka C?
- 24. Rozszerzanie języka C#?
- 25. Sprawdzanie składni języka C# z wiersza poleceń
- 26. Równoważna z Array.some w ruby / railach
- 27. Automatyczna dokumentacja zbiorów danych
- 28. Równoważna nazwa Golang.txt
- 29. Związek dwóch zmiennych zbiorów
- 30. Implementacja języka C++ Cast
Ponieważ jest to * nieuporządkowany *, czy nie jest początkiem() i końcem() "arbitralny" z definicji? Python prawdopodobnie robi coś podobnego pod kołdrą. – swstephe
Prawda ... Mogę po prostu trzymać się tej implementacji mojego programu. – hlin117