我有这样的代码:
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 *'不同
答案 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()
返回的值使用后递增/递减,因此您仍然会将原始值分配给s
和e
,然后(如果可能的话)增加/减少他们返回的临时工。您显然想要更改分配的值。
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
开始时无关。