【问题标题】:Using push_back on vector allocated on the heap在堆上分配的向量中使用 push_back
【发布时间】:2013-11-25 13:28:55
【问题描述】:

我想在函数内创建一个字符串向量并在堆上为其分配内存。为此,我正在使用

vector<string>* residuetable = new vector<string>();

当我尝试这样做时

&residuetable.push_back(modulo((exponentiate("2", exponent02)), modulus));

即尝试使用push_back 函数将多个函数调用的返回值添加到向量中,我得到编译时错误

request for member 'push_back' in 'residuetable', which is of non-class type 'std::vector<std::string, std::allocator<std::string> >*

如何解决这个问题,并将函数调用的结果添加到堆上分配的向量的末尾?

【问题讨论】:

  • 改为使用*residuetable 取消引用指针(也就是说,如果您想保留点语法)。
  • @ChrisO:或者更好的是,**&residuetable 也保留当前代码:-)
  • @KerrekSB,我的立场是正确的。

标签: c++ vector heap-memory c++98


【解决方案1】:

使用->通过指针访问类成员:

residuetable->push_back(...);

然后再想想你是否真的想和new 混在一起。我很确定你没有。

【讨论】:

  • 我不确定我是否理解。如果我想在堆上分配内存,我会用什么其他方式来代替new?我的理解是,数组等大型数据结构通常应该分配在堆上。
  • @ToshioYamaguchi:关键是您不应该根本动态分配向量。
  • @ToshioYamaguchi:向量在堆上分配它的数组——这就是它的目的。您可能不希望将向量本身放在堆上,除非您对它做一些不寻常的事情。如果您确实有充分的理由,请继续这样做;但请考虑一下这是否真的是您想要的。
  • @ToshioYamaguchi 矢量自动为您执行此操作。当您将项目添加到向量空间时,它们会在堆上分配。也不需要将向量本身放在堆上。
【解决方案2】:

你想要:residuetable->push_back("foo");

【讨论】:

    【解决方案3】:

    你用&代替*(*a).ba->b一样:

    residuetable->push_back("foo");
    

    但通常我们不会动态分配容器,因为有更好的方法来管理您的数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-16
      • 1970-01-01
      • 2016-04-03
      • 1970-01-01
      • 2020-03-30
      • 2018-12-21
      • 1970-01-01
      相关资源
      最近更新 更多