获取struct array c ++中的元素数量

时间:2016-03-17 00:56:50

标签: c++ arrays struct

我需要在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 ++

4 个答案:

答案 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;

注意括号。可悲的是,由于几个原因,它无法告诉你你想要什么。

  1. feature是指针。
  2. 指针是存储中的位置,地址,并且您可能遇到的任何系统上的所有地址都将具有相同的大小,可能是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数组传递给函数时,请记住这一点。

    1. 一个数组知道它的大小,但没有关于使用了多少。
    2. 从我们上面的规模来看,我们可以计算容量,但坦率地说,这是一个糟糕的赌注。可以定义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::vectorvector为你做各种各样很酷的事情,比如自己调整大小并计算实际使用的数量。此外,与典型的指针和动态阵列方法不同,它符合三级规则。 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;
      

      现在你必须维护capacitynum_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或其他您不希望有意义使用的其他内容),然后查看您可以循环多远在找到这个价值之前;