【发布时间】:2012-05-03 20:38:54
【问题描述】:
我有这样的代码:
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 *”不同
【问题讨论】:
-
我以前从未见过将迭代器算法应用于
end()。另外,你想++s,而不是begin()的临时。 -
不应该
ptr_t pstr是ptr_t* pstr? -
@zvrba:永远不要使用
new[]。大错特错,难以置信。 -
另一个快速说明:如果您正在动态分配空间,为什么不使用
std::vector来做到这一点?std::array背后的想法是不必必须在堆上分配空间。 -
我是第一个建议在原始数组上使用 std::array 的人,但是尝试像这样将原始数组“转换”为 std::array 似乎不是最好的主意。例如。我认为 sizeof(ptr_t) * num_elements 在技术上可能不是正确的大小。就做
std::random_shuffle(pstr+1, pstr+num_elements-1);