这篇文章将讨论如何从 C++ 中的 STL 容器中获取随机值,例如 std::vector, std::list, std::set, std::map
, ETC。
1.使用迭代器
我们可以使用迭代器在给定的 STL 容器中获取随机值。我们知道所有 STL 容器都支持迭代器。这个想法是生成一个随机数 r
介于 0 和 n-1
, 在哪里 n
是容器的大小。然后我们将一个迭代器带到给定容器的开头,并将该迭代器推进 r
职位。现在迭代器指向的对象将是我们的随机值。
生成 0 到 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 容器中获取随机值的全部内容。