【发布时间】:2017-10-16 18:29:18
【问题描述】:
我有一个 vector<T> input,我想通过 STL C++17 (http://en.cppreference.com/w/cpp/algorithm/sample) 中的 std::sample 算法从中获取 n 个随机选择的元素。如果results 是vector<T> 类型,则代码可以正常工作。
代码示例 1(未返回指针)
auto getSamples(unsigned int noSamples, const vector<T> &input)
{
vector<T> results;
std::mt19937 twisterEngine;
std::sample(input.begin(), input.end(), std::back_inserter(results),
noSamples, twisterEngine);
return results;
}
但是,我不是在寻找存储在 input 中的元素的值/副本,而是希望获得指向 n 采样元素的指针。有什么技巧可以让我仅使用标准 c++ 代码(例如,不使用 boost 库等)获取 vector<T*> results 返回的指针吗?我需要如何调整以下代码才能完成?
代码示例 2(打算返回指针)
auto getSamples(unsigned int noSamples, const vector<T> &input)
{
vector<T*> results;
std::mt19937 twisterEngine;
std::sample(input.begin(), input.end(), std::back_inserter(results),
noSamples, twisterEngine);
return results;
}
【问题讨论】:
-
我会不返回指向样本的指针,因为
input是一个函数局部向量,所以你会传回一个悬空指针向量。唯一安全的情况是input被const&传递,并且您可以保证input将在results的生命周期内存在 -
调整了代码,使输入由 const& 传递。但是,我想在结果中返回指针。
-
我不认为
sample是正确的算法。我会用所有可用的指针填充一个向量,然后选择该向量随机排列的第一个n元素 -
...erm 或在包含所有指针的向量上使用
sample(您需要先填充它)。有点困惑,因为我第一次看到sample
标签: c++ algorithm pointers iterator c++17