将std :: random_shuffle与std :: array一起使用

std*_*ave -1 c++ stl std c++11

我有这样的代码:

typedef intptr_t ptr_t;

const int num_elements = 100;
ptr_t *pstr = (ptr_t *)malloc(sizeof(ptr_t) * num_elements);
std::array<ptr_t,num_elements> *parray = new (pstr) std::array<ptr_t,num_elements>;
Run Code Online (Sandbox Code Playgroud)

我希望能够将元素1洗牌到num_elements-2,所以我想使用std :: shuffle.

auto s = parray->begin()++;
auto e = parray->end()--;
std::random_shuffle ( s, e );
Run Code Online (Sandbox Code Playgroud)

我得到一个投诉,没有重载功能.我觉得自己无法看到自己做错了什么,我感到非常愚蠢.我该怎么做?

编辑:由于答案和反馈,它已改为

auto s = parray->begin();
s++;
auto e = parray->end();
std::random_shuffle ( s, e );
Run Code Online (Sandbox Code Playgroud)

但是,在'auto e'上我得到:'auto'的间接级别与'int*'不同

Dav*_*e S 5

回答你的直接问题:我相信你的错误是使用后增量运算符,它在递增之前返回它们的原始值.由于std::array迭代器基本上都是指针,请尝试

auto s = parray->begin() + 1;
auto e = parray->end() - 1;
Run Code Online (Sandbox Code Playgroud)

编辑:现在,其余的.为什么你这样做呢?您是否考虑 std::vector<int> arr(100)过创建包含100个元素的动态数组?它有类似的功能,没有指针的所有直接操作?

编辑2:阅读完你的评论之后,我意识到问题在于你试图将你作为指针给出的数组洗牌.在这种情况下,我根本不会做新的展示位置.假设你有指针pstr,这应该工作.

std::random_shuffle(pstr +1, pstr + num_elements - 1);
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为为了算法库的目的,数组中的简单指针将作为随机访问迭代器.