我很难让 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() 期望的类型?任何意见,将不胜感激!
std::end(numbers)
This numbers
变量是一个
int *
这就是它的类型。这个指向整数的指针并没有告诉任何人有多少个int
它所指向的。你分配它指向10000000int
s。但是一旦你分配了它,你最终得到的只是一个指向int
,仅此而已。由您的代码来跟踪该指针到底指向您什么。如果你要这样写,你最终会得到完全相同的指针:
int n;
int *numbers=&n;
This numbers
指针与您创建的指针完全相同。它只是一个指向int
。不多不少。
std::begin()
and std::end()
不适用于普通指针,例如指向int
在这里,因为正如我刚才所说,指向某个对象的指针没有任何内容表明它指向多少个连续对象。它可能是一个int
。可能是两个int
是。也许一百万。或者也许什么都没有,如果指针是nullptr
.
如果你想对动态分配的int
数组,直接传递开始和结束指针即可:
std::sort(number, numbers+10000000);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)