【问题标题】:C++ a class with an array of structs, without knowing how large an array I needC++ 一个具有结构数组的类,不知道我需要多大的数组
【发布时间】:2010-03-19 00:30:03
【问题描述】:

我有一堂课,其中包含名字、年龄、学校等字段。我需要能够存储其他信息,例如,他们去过哪里,是哪一年。我不能专门声明另一个类来保存 travelDestination 和哪一年,所以我认为结构可能是最好的。这只是一个例子:

struct travel {
    string travelDest;
    string year;
};

问题是人们旅行的次数可能不同。我正在考虑只使用一组旅行结构来保存数据。但是我如何创建一个固定大小的数组来保存它们,而不知道我需要它有多大?

也许我正在以完全错误的方式解决这个问题,所以任何关于更好方法的建议都将不胜感激。


我意识到类和结构之间本质上没有区别,但是出于分配标准的目的,我不允许使用“类”,所以是的。

【问题讨论】:

  • “我不能专门声明另一个类来保存 travelDestination 和哪一年”。你可以,事实上你有(在 C++ 中,关键字struct 定义了一个类。关键字class 也是如此)。不要害怕在 C++ 中定义尽可能多的类,它们没有税 ;-)
  • 从某种意义上说,这是作业的一部分,其中一个标准确切地规定了我们应该拥有哪些课程:(否则是的,我只会使用一个课程。我会看看我们是否可以使用其他容器,但我感觉我们不能。
  • 看,我可能会因为花太多时间与教师争论而被淘汰。如果他们想禁止“复杂”的课程,但允许像您计划的那样“简单”的课程,那么他们应该定义他们的术语。例如,struct travel { string dest; int year; void print() {std::cout << year <<": "<< dest << "\n"; }; 是不是“未经批准的额外课程”?可能是的,但为什么不管你做与不做对任务很重要?以此类推。
  • 同意。标准在细节上非常模糊。这是一项有趣的作业,非常适合我学习 C++ 和 OO。

标签: c++ arrays data-structures


【解决方案1】:

您可以尝试将std::vector 与每个人相关联,向量中的每个条目都包含一个结构:

typedef struct travel {
    string travelDest;
    string year;
} travelRecord;

std::vector<travelRecord> travelInfo;

然后您可以将项目添加到您认为合适的向量中:

travelRecord newRecord1 = {"Jamaica", "2010"};
travelInfo.push_back(newRecord1);

travelRecord newRecord2 = {"New York", "2011"};
travelInfo.push_back(newRecord2);

更多关于向量运算的信息可以在here找到。

【讨论】:

  • std::vector&lt;travel&gt; 完成这项工作。 C++ 中确实存在结构名称的单独空间,但您不需要使用它。
  • typedef 和类名在 C++ 中位于同一个命名空间中。 struct A { int dummy; }; typedef int A; 在 C++ 中是不可能的,就像在 C 中一样。如果你在 C++ 中编写 struct A { }; typedef struct A A;(这是允许的特殊情况),它重新定义该名称:之前是一个类名吗,那么它就是一个 typedef-name 。之后没有一个类名不再是 typedef 名。
  • @Steve - 我不确定我是否理解您的评论。 “结构名称的分隔空间”是什么意思?
  • (所以在一个非常迂腐的 C++ 编译器上,typedef struct A { } A; struct A a; 将无法编译,因为详细的类型说明符 struct A 会将标识符解析为 typedef-name(参见 7.1.5.3/1) . 然而,comeau/EDG、gcc 和 clang 都没有这样做——大概是因为它会破坏很多代码)。
  • 啊,谢谢 litb。我应该说,“在 C++ 中确实存在类名之前粘贴 struct 的能力......”;-)。
【解决方案2】:

尝试了解 C++ 标准模板库 (STL)。例如,您可以使用list

【讨论】:

    【解决方案3】:

    您可能希望使用其中一个 STL 容器类来保存您的结构(或者更好的是,将您的结构重构为一个类以隐藏数据成员并创建 get/set 访问器)

    std::向量

    标准::列表

    ...

    您选择哪一个完全取决于您预期对它们执行的操作。向量适用于基本存储和随机访问。如果您想执行任何排序或搜索功能,您可能需要一个列表,甚至可能需要一个地图或多地图。

    这里是有关 STL 的更多信息的良好起点:http://www.parashift.com/c++-faq-lite/class-libraries.html

    【讨论】:

      【解决方案4】:

      我同意其他人的观点,使用类似列表的 stl 容器。当您将数据推送到列表(或任何其他容器)时,列表(或任何其他容器)将会增长,如下所示:

      
      #include <list>
      #include <string>
      using namespace std;
      
      struct travel {
          string travelDest;
          string year;
      };
      
      int main() {
          list<travel> travels;
          travel t = {"Oslo", "2010"};
          travels.push_back(t);
      }
      

      还要注意,虽然你说你不能创建一个类,但你完全愿意创建一个结构。在 C++ 中,这些实际上是完全相同的,除了结构变量默认是公共的,而类变量默认是私有的。

      【讨论】:

        【解决方案5】:

        要创建一个包含 100 个元素的数组,您可以这样做:

        travel* pTravelArray = new travel[100];
        

        你可以做那个变量

        int numberOfElements = 100;
        travel* pTravelArray = new travel[numberOfElements];
        

        完成后不要忘记摆脱它:

        delete [] pTravelArray;
        

        正如其他人所建议的那样,STL 库中有一些更好的(在内存分配方面不太容易做一些愚蠢的事情)您可以使用的集合。

        【讨论】:

        • 请改用vectornew[]/delete[] 的这段代码应该被视为这样做的原因,而不是建议;-)
        • 这种方法的问题是,我事先不知道这个人去过多少地方。而且我真的不想分配一个固定的数字,希望这就足够了。
        • 我明白你的意思,但公平地说,你确实问过“我如何创建一个固定大小的数组来保存它们”:-)
        猜你喜欢
        • 2011-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-26
        • 1970-01-01
        • 2018-08-24
        相关资源
        最近更新 更多