我知道在C++中无法获得动态创建的数组的大小,例如:
int* a;
a = new int[n];
Run Code Online (Sandbox Code Playgroud)
我想知道的是:为什么?人们是否在C++规范中忘记了这一点,还是有技术原因?
信息不是存储在某个地方吗?毕竟,命令
delete[] a;
Run Code Online (Sandbox Code Playgroud)
似乎知道它必须释放多少内存,所以在我看来,delete[]有一些方法可以知道它的大小a.
草案C++ 14包括运行时大小的数组和std::dynarray容器.从我所知道的,两者之间的唯一真正的区别在于std::dynarray有一个STL接口(例如begin,end,size,等),同时运行时大小的数组没有.那么为什么C++ 14需要它们呢?
我知道运行时大小的数组是核心语言的std::dynarray一部分,同时也是标准库的一部分,但是该提议std::dynarray清楚地表明作者希望编译器在许多情况下能够提供特殊支持,std::dynarray以便它可以高效尽可能地,即,与运行时大小的数组一样高效.因此,语言/库的区别似乎有点人为.
那么,为什么C++ 14需要两个运行时大小的数组std::dynarray呢?并且鉴于它std::dynarray具有更丰富的(STLified)接口,为什么不只是删除运行时大小的数组,假设std::dynarray可以以相同的运行时效率实现?
澄清
当我谈到"运行时大小的数组"时,我指的是N3639中描述的新的C++ 14核心语言特性,而不是传统的C数组或VLA或C++ 11中的任何内容.
有一个基于范围的for循环,其语法如下:
for(auto& i : array)
Run Code Online (Sandbox Code Playgroud)
它适用于常量数组,但不适用于基于指针的动态数组
int *array = new int[size];
for(auto& i : array)
cout<< i << endl;
Run Code Online (Sandbox Code Playgroud)
它给出了有关替换失败的错误和警告,例如:
错误] C:\ Users\Siegfred\Documents\C-Free\Temp\Untitled2.cpp:16:16:错误:没有匹配函数来调用'begin(int*&)'
如何在动态数组中使用这种新语法?
I can't understand why the std::begin() function doesn't work when it is given an int * arr pointer, but it works with an int arr[] array.
This code doesn't work:
int *arr = new int[5]{ 1,2,3,4,5 };
if (find(begin(arr),end(arr),5)!=end(arr))
{
cout << "found";
}
Run Code Online (Sandbox Code Playgroud)
This code does work:
int arr2[5] = { 1,2,3,4,5 };
if (find(begin(arr2),end(arr2),5)!=end(arr2))
{
cout << "found";
}
Run Code Online (Sandbox Code Playgroud)