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