cout << (sizeof feature / sizeof *feature) << endl;
应该是
cout << (sizeof(feature) / sizeof(*feature)) << endl;
注意括号。遗憾的是,它无法告诉您您想要什么,原因有几个。
-
feature 是一个指针。
指针是存储中的一个位置,一个地址,并且您可能遇到的任何系统上的所有地址系统都将具有相同的大小,并且可能是 4 或 8 个字节。让我们暂时假设 4 并将其代入等式。
cout << (4 / sizeof(*feature)) << endl;
这肯定会打印 0,因为 *feature 肯定大于 4,并且在整数数学中 4 / <anything greater than 4> 将被截断为 0。
如果定义了feature
Features feature[100];
除非需要更改指向的数据块的大小,否则没有理由不更改。无论如何,现在功能不仅仅是指向某个任意内存块的指针。它正好是 100 个 Features 的块。它的大小为 100 * sizeof(feature[0])。这是数组和指针之间的根本区别,所以下次有人告诉你“数组是指针!”你可以告诉他们自己去咒骂删除。
例如:
cout << (sizeof(feature) / sizeof(feature[0])) << endl;
将打印 100,而不是我们在 feature 是指针时返回的 0。 0 != 100。数组不是指针。在很多情况下,数组可以像指针一样使用。
Feature feature2d[100][100];
Feature ** feature2dptr = feature2d;
不是其中之一。当您必须将二维数组传递给函数时,请记住这一点。
- 数组知道它的大小,但不知道使用了多少。
从大小我们可以像上面那样计算容量,但坦率地说,这是一个愚蠢的赌注。 feature 可以定义
constexpr int MAX_FEATURES = 100;
Features feature[MAX_FEATURES];
然后而不是这个:
cout << (sizeof(feature) / sizeof(feature[0])) << endl;
我们打印不那么复杂的内容
cout << MAX_FEATURES << endl;
但这仍然不是我们想要的。
那么我们如何正确地做到这一点呢?
The preferred C++ solution is to use std::vector。 vector 为您做了各种很酷的事情,比如调整自身大小并计算实际使用了多少。此外,与典型的指针和动态数组方法不同,它符合三规则。 What is The Rule of Three? 这真的很重要。我建议阅读链接。
定义vector 的Features
std::vector<Features> feature;
存储Feature
Feature temp;
feature.push_back(temp);
通常更好的方法是为Feature 和
定义一个构造函数
feature.emplace_back(feature1, feature2, feature3, feature4, feature5);
因为这消除了创建和复制临时Feature 的需要。
获取Features中feature的数量
feature.size();
简单吧?
好的。所以有些人认为你不应该使用vector,除非你年纪大了,更有经验了。他们希望你在学习编写一个体面的、结构良好的程序并弄清楚如何调试新程序员所犯的小错误时,经历内存管理的陷阱。我对此并不失望,但它似乎是统治这片土地的教育范式。
让我们从固定数组开始,因为它很简单,也没有那么复杂。
constexpr int MAX_FEATURES = 100;
Features feature[MAX_FEATURES];
int num_features = 0;
每次需要向数组添加Feature 时,首先要确保有空间。
if(num_features < MAX_FEATURES)
然后添加Feature
feature[num_features] = new_feature;
然后递增,在num_features 上加一。
num_features++;
你有多少Features?
cout << num_features << endl;
如果你绝对必须用指针来做这个
int capacity = 100;
Features * feature = new Feature[capacity];
int num_features = 0;
现在您必须维护capacity 和num_features,因为您会做这种愚蠢的事情的唯一原因是能够根据需要调整feature 指向的内存块的大小。
if(num_features >= MAX_FEATURES)
{
做一个更大的feature
capacity = capacity * 1.5; // why 1.5? Because I felt like it.
Features * bigger_feature = new Features[capacity];
复制从feature到bigger_feature的所有内容
for (int index = 0; index < num_features; index++
{
bigger_feature[index] = feature[index];
}
释放feature使用的内存
delete[] feature;
将feature 替换为bigger_feature
feature = bigger_feature;
}
现在可以
feature[num_features] = new_feature;
num_features++;
这又是一个漂亮的可剪切粘贴的 blob:
if(num_features == MAX_FEATURES)
{
capacity = capacity * 1.5; // why 1.5? Because I felt like it.
Features * bigger_feature = new Features[capacity];
for (int index = 0; index < num_features; index++
{
bigger_feature[index] = feature[index];
}
delete[] feature;
feature = bigger_feature;
}
feature[num_features] = new_feature;
num_features++;
废话。而且这个指针杂乱无章绝对不符合三规则,因此您可能必须编写复制和移动构造函数、赋值和移动运算符以及析构函数。
当你完成后,你必须
delete[] feature;
你有多少Features?
cout << num_features << endl;