将 std::random_shuffle 与 std::array 一起使用
Use std::random_shuffle with std::array
我有这样的代码:
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 *"的间接级别不同
回答您的直接问题:我相信您的错误是使用了 post 增量运算符,这些运算符在递增之前返回其原始值。 由于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);
这是有效的,因为数组中的简单指针将用作算法库的随机访问迭代器。
即使编译器允许,你的代码也不会做你想要的。您正在尝试对从 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
的意义。
相关文章:
- 将fold表达式与std::一起用于两个元组
- 将 std::allocate_shared 与多态资源分配器一起使用
- 将 std::set 与基于键的比较器一起使用
- 如何将AERT_Allocate与 std:vector 一起使用
- 将用户定义的类型与 std::vector 和 std::sort 一起使用
- 将图形属性与 std::unique_ptr 捆绑在一起
- 将 std::map::emplace 与返回 shared_ptr 的函数一起使用是否正确?
- 将新放置与 std::函数一起使用不起作用
- 不能将C++的"std::filesystem"库与介子构建一起使用
- 将 std::function 与模板一起使用
- 是否可以将 std::basic_ifstream 和 std::basic_ofstream 与自定义缓冲区一起使用?
- 当返回语句时,逗号运算符、大括号初始化列表和 std::unique_ptr 组合在一起
- 如何将 std::find() 与 2d std: 数组一起使用?
- boost::interprocess::file_lock 与 std::ostream 一起使用时的错误行为
- std::remove() 按预期处理文字,但不能与取消引用的迭代器一起工作
- 将 std::transform 与 std::back_inserter 一起使用是否有效?
- 为什么使用与父级声明的 std::function 在与子级一起使用时会显示错误?
- 是否已经有一个 constexpr std::bit_cast 与 g++ 一起使用
- 将 std::variant 与 gmock 1.8 对象一起使用时编译错误
- 我不能将 'fill' std::vector 构造函数与 unique_ptrs 一起使用