使用动态数组排序算法编译器错误

Posted

技术标签:

【中文标题】使用动态数组排序算法编译器错误【英文标题】:sort algorithm compiler error with dynamic array 【发布时间】:2017-07-16 00:23:29 【问题描述】:

我很难让 std::begin() 与动态分配的数组(指针)一起工作,而它似乎与堆栈分配的数组一起工作。

这行得通:

int numbers[100];

// Fill array with numbers

std::sort(std::begin(numbers), std::end(numbers));

这不是

int* numbers = new int[10000000];

// Fill array with numbers

std::sort(std::begin(numbers), std::end(numbers));

这是产生的错误。

ptests.cpp:120:33: error: no matching function for call to ‘begin(int*&)’
     std::sort(std::begin(numbers), std::end(numbers));
                                 ^
ptests.cpp:120:33: note: candidates are:
In file included from /usr/include/c++/4.8/utility:74:0,
                 from /usr/include/c++/4.8/algorithm:60,
                 from ptests.cpp:1:
/usr/include/c++/4.8/initializer_list:89:5: note: template<class _Tp> constexpr const _Tp* std::begin(std::initializer_list<_Tp>)
     begin(initializer_list<_Tp> __ils) noexcept
     ^
/usr/include/c++/4.8/initializer_list:89:5: note:   template argument deduction/substitution failed:
ptests.cpp:120:33: note:   mismatched types ‘std::initializer_list<_Tp>’ and ‘int*’
     std::sort(std::begin(numbers), std::end(numbers));
                                 ^
In file included from /usr/include/c++/4.8/string:51:0,
                 from /usr/include/c++/4.8/random:41,
                 from /usr/include/c++/4.8/bits/stl_algo.h:65,
                 from /usr/include/c++/4.8/algorithm:62,
                 from ptests.cpp:1:
/usr/include/c++/4.8/bits/range_access.h:48:5: note: template<class _Container> decltype (__cont.begin()) std::begin(_Container&)
     begin(_Container& __cont) -> decltype(__cont.begin())

是否可以将动态指针转换为 begin() 期望的类型?任何建议将不胜感激!

【问题讨论】:

在您的问题中包含您的错误文本。我不知道.webp 文件是什么。见How to Ask a QuestionHow to create a Minimal, Complete, and Verifiable example 【参考方案1】:
std::end(numbers)

这个numbers 变量是一个

int *

这就是它的类型。这个指向整数的指针并没有告诉任何人它指向多少ints。您将其分配为指向 10000000 ints。但是一旦你分配了它,你最终得到的只是一个指向int 的指针,仅此而已。由您的代码来跟踪该指针究竟指向您什么。如果你要写,你会得到完全相同的指针,简单地说:

int n;

int *numbers=&n;

这个numbers 指针与您创建的指针完全相同。它只是一个指向int 的指针。不多也不少。

std::begin()std::end() 不适用于普通指针,例如您在此处指向 int 的指针,因为正如我刚才所说,指向某个对象的指针并不能指示有多少连续对象它指向。它可能是一个int。可能是两个ints。也许有一百万。或者,如果指针是 nullptr,则可能什么都没有。

如果要对动态分配的int 数组进行排序,只需直接传递开始和结束指针:

std::sort(number, numbers+10000000);

【讨论】:

以上是关于使用动态数组排序算法编译器错误的主要内容,如果未能解决你的问题,请参考以下文章

代码与算法集锦-归并排序+树状数组+快排+深度优先搜索+01背包(动态规划)

JAVA 算法---桶排序算法与基数排序算法

算法——桶排序算法

数据结构算法设计模式

500,000 个已排序整数数组上的 C++ 快速排序算法中的 Seg 错误

动态可视化十大排序算法之冒泡排序