【问题标题】:for_each pointer in a vector of pointers指针向量中的 for_each 指针
【发布时间】:2013-07-31 12:29:38
【问题描述】:

我想在 for_each() 函数中初始化一个指针向量:

#include <stdlib.h>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

class Cow{
        public:
                Cow(){ _age = rand()% 20; }
                int get_age() { return _age;}
        private:
                int _age;
};

void add_new(Cow* cowp)
{
        cowp = new Cow;
}

int main()
{
        srand(time(NULL));
        const int herd_size=10;
        vector<Cow*> herd(herd_size);
        for_each(herd.begin(), herd.end(),add_new);
        cout << "Age: " << herd[0]->get_age() << endl; // line 27
}

但是,我在第 27 行收到运行时“分段错误”错误。群体向量似乎未初始化。为什么?

【问题讨论】:

  • :set nonu 并用 cmets 标记有问题的行,以便我们可以复制粘贴代码并编译而不会浪费时间。
  • @jdero "add_new" 是对向量每个元素的回调函数。
  • 请不要包含行号,这会让人们复制和粘贴非常烦人。只需用注释标记必要的行。
  • 还有,不应该是herd[it]吗?
  • Jim:不,我只想打印第一个元素

标签: c++ pointers stl


【解决方案1】:

您的函数按值获取指针,然后重新分配这些副本。您需要通过引用来获取它们以影响向量中的指针。

void add_new(Cow *& cowp) 

【讨论】:

    【解决方案2】:
    void add_new(Cow* cowp)
    {
            cowp = new Cow;
    }
    

    您只是在修改 Cow 指针的本地版本。请记住,局部变量在离开其函数时会被销毁,在这里您的指针作为值传递!

    您想修改向量内的指针,因此您需要引用:

    void add_new(Cow *& cowp)
    {
      cowp = new Cow;
    }
    

    这样,您就可以有效地修改位于向量中的原始指针。

    【讨论】:

      【解决方案3】:

      因为std::generate 是更好的匹配,因为它应该用于生成序列。

      另一个重要的变化是你的函数必须对指针有一个引用

      void add_new(Cow*& cowp)
      

      实际上,你真的不需要使用std::for_each 甚至std::transform,或者使用单独的创建函数,这要归功于新的 C++11 功能:

      for (auto& cow : herd)
          cow = new Cow;
      

      实际上我会建议您使用指针,因此不需要其他初始化。

      【讨论】:

      • 如果我们切换算法,generate 可能会比transform 更好,因为新值绝不依赖于旧值。
      猜你喜欢
      • 2011-08-04
      • 1970-01-01
      • 2019-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-13
      • 2013-01-04
      相关资源
      最近更新 更多