【问题标题】:Initialization of vector of objects对象向量的初始化
【发布时间】:2016-12-09 08:06:02
【问题描述】:

在我提出问题之前,让我提前提一下,我知道这个话题已经讨论了很多,但是通过查看大多数答案,我再次未能找到实现我想要的正确方法(很可能是因为我错过了给出的答案)。 所以,假设我想创建 20 倍的对象向量(每个大小为 10),它应该是全局范围的(从某种意义上说,这是在类内部完成的,我希望这些对象向量在类之外传递)。 所以,我真的不确定以下是否有效:

for ( int i =0; i<20; i++)
 vector<A> * vec_of_class = new vector<A>(10);
 /*where A is the class and I use new to have them in the heap,
 so that they won't be local */

现在,我知道这意味着我应该格外小心地处理它们 并确保我准备删除它们,但我不确定我所做的操作是否有效。一般来说,我想实现初始化可以在全局范围内使用的对象 A 的 20 个不同向量(操作发生在另一个类的函数内部),我知道它可以使用 对象 A 的向量向量,但我想了解如何正确执行此类操作(在另一个类的主体函数内初始化对象 A 的 20 个不同向量并全局使用它们)。 我希望我的问题不会让人困惑,你可以在这里给我一些帮助。

【问题讨论】:

  • 好吧,我也是这么想的,但是那我该如何正确操作呢?
  • 你为什么不直接vector&lt;vector&lt;A&gt;&gt; vec_of_class(20, vector&lt;A&gt;(10));
  • 我怀疑你想要这样的班级成员:std::vector&lt;std::vector&lt;A&gt; &gt; member {20, std::vector&lt;A&gt;(10)};。等等,20 个向量,每个向量 10 个元素。
  • 向量的向量有什么问题?你为什么要拒​​绝对你陈述的问题最自然、最直接的解决方案?有什么事情你忘了告诉我们吗?
  • 您需要解释这些原因。在那之前,摆在我们面前的显然是XY problem 的一个实例。如果这些原因确实与您声称的问题无关,那么它们如何影响解决方案?

标签: c++ object vector heap-memory


【解决方案1】:

永远不应该动态分配任何标准容器,包括向量。所以std::vector&lt;&gt; = new &lt;&gt;总是错的。

要初始化向量,您可以使用多种技术。我发现初始化列表特别方便,如下所示:

std::vector<int> vec{10, 20, 30, 40, 50};

【讨论】:

  • 不是向量 vec = {10,20,30,40,50}; ?
  • @OmidCompSCI 两者都有效
  • @underscore_d,谢谢刚刚浏览了统一初始化。我发誓 C++ 简直就是语言之神!
【解决方案2】:

所以,假设我想创建 20 次对象向量(比如每个对象的大小为 10)

这很容易。使用:

std::vector<std::vector<A>> my_data{20, std::vector<A>{10}};

这应该是全局范围的(从某种意义上说,这是在类内完成的,我希望将这些对象向量传递到类外)。

我不清楚你想在这里完成什么。

当在类中完成某件事时,它可以在static 成员函数或常规成员函数中完成。看来您应该使用static 成员函数,但我不确定。

如果你使用static 成员函数,我建议:

std::vector<std::vector<A>> const& TheClass::get_my_data()
{
   static std::vector<std::vector<A>> my_data{20, std::vector<A>{10}};
   static bool inited = false;
   if ( !inited )
   {
      // Set the values of the elements in my_data
      // ...

      inited = true;
   }
   return my_data;
}

如果您使用常规成员函数,我建议在构造函数中填充my_data 并从函数返回。

// Need to make my_data a member variable
TheClass::TheClass() : my_data{20, std::vector<A>{10}}
{
   // Set the values of the elements in my_data
   // ...
}

std::vector<std::vector<A>> const& TheClass::get_my_data() const
{
   return my_data;
}

【讨论】:

    【解决方案3】:

    如果将变量声明为函数,则该变量的作用域将是函数。从外部无法访问它。

    您可以做的是在全局范围内声明这 20 个指针,并在您想要的任何位置(例如,在函数内部)初始化它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-26
      • 1970-01-01
      • 2012-06-21
      • 1970-01-01
      • 2017-01-11
      相关资源
      最近更新 更多