我需要在struct数组中找到元素的数量
我有这个结构
struct Features {
int feature1;
string feature2;
string feature3;
string feature4;
bool feature5;
};
然后我把它变成了一个数组
Features *feature = new Features[100];
然后我输入了一些值
for(int i = 0; i < 3; i++)
{
feature[i].feature1 = 5;
feature[i].feature2 = "test";
feature[i].feature3 = "test2";
feature[i].feature4 = "test3";
feature[i].feature5 = true;
}
现在我想得到数组的大小,应该是3(2)
我该怎么做?
cout << (sizeof feature / sizeof *feature) << endl;
似乎无法正常工作,因为它打印的值不正确。 (它继续打印4)
对不起,如果这是一个愚蠢的问题,我还在学习c ++
答案 0 :(得分:3)
不,实际上数组的大小是100而不是3,因为你分配了一个带有String url = "blablable....";
String url_without_p;
int p_index = url.indexOf("p=");
if (p_index == -1)
{
url_without_p = url;
}
else
{
int end_index = url.indexOf("&", p_index);
if (end_index == -1)
{
url_without_p = url.substring(0, p_index);
}
else
{
url_without_p = url.substring(0, p_index) + url.substring(end_index);
}
}
return url_without_p;
的100元素数组。你在数组中初始化3个元素这一事实并不重要。它仍然是一个100元素阵列。
但无论它是3还是100,它都无关紧要。由您来跟踪分配的阵列的大小。 C ++不会为你做这件事。
但如果你想让C ++跟踪数组的大小,可以使用new
。这就是它的用途。
答案 1 :(得分:2)
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])。这是数组和指针之间的根本区别,所以下次有人告诉你&#34;数组是指针!&#34;你可以告诉他们去咒骂删除。
例如:
cout << (sizeof(feature) / sizeof(feature[0])) << endl;
将打印100,而不是当feature
是指针时我们返回的0。 0!= 100.数组不是指针。在很多情况下,数组可以像指针一样使用。
Feature feature2d[100][100];
Feature ** feature2dptr = feature2d;
不是其中之一。当你必须将2D数组传递给函数时,请记住这一点。
从我们上面的规模来看,我们可以计算容量,但坦率地说,这是一个糟糕的赌注。可以定义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 = greater_feature;
}
现在你可以
feature[num_features] = new_feature;
num_features++;
这里再次出现了一个漂亮的可切割的斑点:
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++;
布拉赫。而且这个指针mishmash绝对不是三级规则,因此你可能需要编写复制和移动构造函数,赋值和移动运算符以及析构函数。
当你完成后,你必须
delete[] feature;
你有多少Features
?
cout << num_features << endl;
答案 2 :(得分:1)
你需要跟踪它。当您为100个功能分配足够的空间时,您就可以获得足够的空间来容纳100个功能。跟踪你随后初始化的人数等等是你需要做的事情。
答案 3 :(得分:0)
我确定它按照编程打印了正确的值。但是sizeof
只告诉你分配了多少空间,而不是有多少成员包含有意义的值。
如果需要可变大小的数组,请使用std :: vector。否则,保持您的设置,但将成员(例如feature1
)初始化为可识别的值(例如-999或其他您不希望有意义使用的其他内容),然后查看您可以循环多远在找到这个价值之前;