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

时间:2017-07-16 00:23:30

标签: c++ c arrays

我很难让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()期望的类型?任何建议将不胜感激!

1 个答案:

答案 0 :(得分:4)

std::end(numbers)

numbers变量是

int *

它的类型是什么。并且这个指向整数的指针没有任何内容可以告诉任何人它指向的int多少int。您将其分配为指向10000000 int s。但是一旦你分配了它,你最终得到的只是指向int n; int *numbers=&n; 的指针,仅此而已。由您的代码来跟踪这个指针指向您的确切内容。如果你要写的话,你将完全使用相同的指针结束:

numbers

int指针与您创建的指针完全相同。它只是指向std::begin()的指针。没什么,没什么。

std::end()int对于普通指针不起作用,就像你指向int的指针一样,因为正如我刚才所说,没有什么关于指向某个对象的指针,该对象指示它指向的连续对象的数量。它可以是一个int。它可能是两个nullptr。也许一百万。如果指针是int,则可能一无所获。

如果要对动态分配的std::sort(number, numbers+10000000); 数组进行排序,只需直接传递开始和结束指针:

a_1  ab_1  ac_1    a_2   ab_2   ac_2
2      3     4      5     6      7