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

时间:2012-05-03 20:38:55

标签: c++ stl c++11 std

我有这样的代码:

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>;

我希望能够将元素1改组为num_elements-2,所以我想使用std :: shuffle。

auto s = parray->begin()++;
auto e = parray->end()--;
std::random_shuffle ( s, e );

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

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

auto s = parray->begin();
s++;
auto e = parray->end();
std::random_shuffle ( s, e );

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

2 个答案:

答案 0 :(得分:5)

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

auto s = parray->begin() + 1;
auto e = parray->end() - 1;

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

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

std::random_shuffle(pstr +1, pstr + num_elements - 1);

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

答案 1 :(得分:2)

即使编译器允许它,你的代码也不会做你想要的。您尝试对begin() / end()返回的值使用后递增/递减,因此您仍然会将原始值分配给se ,然后(如果可能的话)增加/减少他们返回的临时工。您显然想要更改分配的值。

auto s= parray->begin();
auto e= parray->end();

++s;
--e;

std::random_shuffle(s, e);

或者,因为你显然有随机访问迭代器:

 std::random_shuffle(parray->begin()+1, parray->end()-1);

我不确定你为什么动态分配一个std::array - 这似乎与使用std::array开始时无关。