C++의 STL 컨테이너(Vector, 목록, 집합)에서 임의 값 가져오기
이 게시물은 다음과 같은 C++의 STL 컨테이너에서 임의의 값을 얻는 방법에 대해 설명합니다. std::vector, std::list, std::set, std::map
, 등.
1. 반복자 사용
반복자를 사용하여 주어진 STL 컨테이너에서 임의의 값을 얻을 수 있습니다. 모든 STL 컨테이너가 반복자를 지원한다는 것을 알고 있습니다. 아이디어는 난수를 생성하는 것입니다 r
0과 사이 n-1
, 어디 n
컨테이너의 크기입니다. 그런 다음 반복자를 주어진 컨테이너의 시작 부분으로 가져오고 해당 반복자를 다음과 같이 진행합니다. r
위치. 이제 반복자가 가리키는 객체는 무작위 값이 됩니다.
0과 사이의 임의 값을 생성하려면 n-1
, 우리는 cstdlib의 기능을 사용할 수 있습니다 rand()
그리고 srand()
또는 에 정의된 표준 생성기를 사용하십시오. <random> C++11에 도입된 헤더.
에 대한 많은 대안이 있습니다 반복자를 다음으로 진행 r
직책:
⮚ 사용 std::advance
표준 알고리즘 std::advance
지정된 위치만큼 반복자를 진행하는 데 사용할 수 있습니다.
1 2 3 4 5 6 7 8 9 |
template<typename T> T random(std::vector<T> const &v) { auto it = v.cbegin(); int random = rand() % v.size(); std::advance(it, random); return *it; } |
⮚ 포인터 연산
다음 코드는 반복자에서 포인터 산술을 수행할 수 있으므로 작동합니다.
1 2 3 4 5 6 7 8 |
template<typename T> T random(std::vector<T> const &v) { auto it = v.cbegin(); int random = rand() % v.size(); return *(it + random); } |
⮚ ++ 연산자
또 다른 솔루션은 다음을 사용하는 것입니다. ++
아래와 같이 지정된 위치만큼 반복자를 진행하려면 while 루프 내부에 연산자를 사용합니다.
1 2 3 4 5 6 7 8 9 10 11 |
template<typename T> T random(std::vector<T> const &v) { auto it = v.cbegin(); int random = rand() % v.size(); while (random--) { ++it; } return *it; } |
2. 사용 []
운영자
멤버 함수를 사용할 수도 있습니다. operator[]
다음과 같은 시퀀스 컨테이너에서 제공 std::vector
, std::array
, std::deque
요소에 대해 연속적인 저장 위치를 사용합니다. 이 접근 방식은 다음과 같이 작동합니다. []
연산자는 컨테이너의 지정된 위치에 있는 요소를 반환합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#include <iostream> #include <vector> #include <algorithm> template<typename T> T random(std::vector<T> const &v) { int r = rand() % v.size(); return v[r]; } int main() { std::vector<int> v = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; for (int i = 0; i < 5; i++) { std::cout << random(v) << std::endl; } return 0; } |
C++의 STL 컨테이너에서 임의의 값을 얻는 것이 전부입니다.