这是从容器中获取随机元素的OK范围的方法吗
Is this the OK scoped way to get random element from the container?
最近我决定试用新的c++11随机库,我想到了一件事。。。从容器中拾取随机元素时,要去掉[rand((%nelements]。原因是我想要可重复的生成,当使用rand封装是不存在的,因为
auto set_a=generateSet(nelements1); //generateSet calls rand
auto set_b=generateSet(nelements2); //so set_b is determined by the previous line :(
这就是我的想法:(注意,这不是线程安全的,它的设计是安全的,调用generateSet不会相互影响(通过更改rand内部值的状态(
template<typename container_type,typename element_type >
class RandElemGetter
{
const container_type& containter_ref;
std::uniform_int_distribution<size_t> distribution;
std::mt19937 engine;
public:
RandElemGetter(container_type& container): containter_ref(container),distribution(0,container.size()-1)
{
}
element_type get()
{
return containter_ref[distribution(engine)];
}
};
用法:
{
vector<int> v{1,2,3,1701,1729};
vector<int> result;
RandElemGetter<vector<int>,int> reg_v(v);
for(size_t i=0;i<nelements;++i)
result.push_back(reg_v.get());
}
那么这个解决方案可以吗?我知道这不是线程安全,这不是重点。我想知道是否有更好的"作用域"方法从随机访问容器中获取随机元素。可以使用std::advanced对其进行修改,以便为所有人工作。
RandElemGetter(container_type container):
containter_ref(container),distribution(0,container.size()-1)
这将按值获取容器,创建一个临时副本,并存储对该副本的引用。构造函数完成后,引用无效。
您需要存储副本,或者通过引用传递参数。无论如何,通过常量引用传递复杂对象是个好主意,以避免不必要的复制。
- 我会使用
<typename container_type, typename value_type = container_type::typename value_type>
。STL容器的value_types有typedef,所以通常不需要重复 - 正确的解决方案确实是返回
*std::advance(containter_ref.begin(), distribution(engine));
- 我将
get()
重命名为operator()
,并提供一个result_type
typedef以符合STL模型AdaptableGenerator
您可能希望在SGI的random_sample
处有一个来自原始STL的峰值;我相信GNU仍然将其作为一个扩展。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用strcpy将char数组的元素复制到另一个数组
- 使用不带参数的函数访问结构元素
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- C++如何通过用户输入删除列表元素
- lower_bound()返回最后一个元素
- 基于多个条件处理地图中的所有元素
- 调整大小后指向元素值的指针unordered_map有效?
- 使用std::transform将一个范围的元素添加到另一个范围中
- 使用函数"remove"删除重复元素
- 具有最大子序列大小的序列,每个元素都相同
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何将元素添加到数组的线程安全函数?
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- 我想访问std::unique_ptr中的一个特定元素
- 如何通过 getter 函数删除矢量的元素?
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 从控制台中删除最后打印的元素
- 这是从容器中获取随机元素的OK范围的方法吗