Joh*_*itb 17
这真的取决于你对"阵列"的意思.C++中的数组将具有一个大小(现在表示"原始"字节大小),等于一个项目大小的N倍.通过那个,可以使用sizeof操作员轻松获得项目数.但这要求您仍然可以访问该数组的类型.一旦将它传递给函数,它将被转换为指针,然后就会丢失.无法确定尺寸.您将不得不构建一些依赖于元素值来计算大小的其他方法.
这里有些例子:
int a[5];
size_t size = (sizeof a / sizeof a[0]); // size == 5
int *pa = a;
Run Code Online (Sandbox Code Playgroud)
如果我们现在丢失名称"a"(及其类型),例如通过将"pa"传递给一个函数,其中该函数只有那个指针的值,那么我们就不走运了.然后我们再也无法收到尺寸了.我们需要将大小和指针一起传递给该函数.
使用时获取数组时,同样的限制也适用new.它返回一个指向该数组元素的指针,因此大小将丢失.
int *p = new int[5];
// can't get the size of the array p points to.
delete[] p;
Run Code Online (Sandbox Code Playgroud)
它不能返回包含数组类型的指针,因为new可以在运行时计算创建的数组的大小.但是C++中的类型必须在编译时设置.因此,new擦除数组部分,并返回指向元素的指针.请注意,您不需要乱用newC++.您可以std::vector按照其他答案的建议使用该模板.
Nol*_*rin 14
C/C++中的数组不会将它们的长度存储在内存中,因此不可能在给定指向数组的指针的情况下找到它们的大小.使用这些语言中的数组的任何代码都依赖于常量已知大小,或者传递指定其大小的单独变量.
如果它确实存在问题,通常的解决方案是使用std::vector标准库中的类,它更接近托管(C#)数组,即存储其长度并且还具有一些有用的成员函数(用于搜索)和操纵).
使用std::vector,您只需调用vector.size()即可获得其大小/长度.
要计算静态数组中的元素数,可以创建模板函数:
template < typename T, size_t N >
size_t countof( T const (&array)[ N ] )
{
return N;
}
Run Code Online (Sandbox Code Playgroud)
对于标准容器,例如std::vector,使用该size() 功能.此模式还与boost阵列一起使用,这些阵列是固定大小的阵列,并且声称静态阵列没有更差的性能.您在上面评论中的代码应该是:
for ( std::vector::size_type i(0); i < entries.size(); ++i )
Run Code Online (Sandbox Code Playgroud)
(假设循环中的大小发生变化,否则将其提升),而不是将大小视为成员变量.
| 归档时间: |
|
| 查看次数: |
62641 次 |
| 最近记录: |