-1

我有这样的代码:

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 *”不同

4

2 回答 2

5

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

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

编辑:现在,至于其余的。你到底为什么要那样做?您是否考虑 std::vector<int> arr(100)过创建一个包含 100 个元素的动态数组?它具有类似的功能,而无需直接操作指针?

编辑2:阅读您的评论后,我意识到问题是您正在尝试对您作为指针给出的数组进行洗牌。在那种情况下,我根本不会做新的安置。假设您有指针 in pstr,这应该可以工作。

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

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

于 2012-05-03T20:44:08.183 回答
2

即使编译器允许,你的代码也不会做你想做的事。您正在尝试对从begin()/返回的值使用后递增/递减end(),因此您仍将原始值分配给sand 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开始的意义。

于 2012-05-03T20:44:14.553 回答