首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >指针向量中的for_each指针

指针向量中的for_each指针
EN

Stack Overflow用户
提问于 2013-07-31 12:29:38
回答 3查看 1.5K关注 0票数 1

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

代码语言:javascript
复制
#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行得到一个运行时“分段错误”错误。牛群矢量似乎还没有被初始化。为什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-07-31 12:32:54

您的函数按值接受指针,然后重新分配这些副本。为了影响向量中的指针,您需要引用它们。

代码语言:javascript
复制
void add_new(Cow *& cowp) 
票数 8
EN

Stack Overflow用户

发布于 2013-07-31 12:33:30

代码语言:javascript
复制
void add_new(Cow* cowp)
{
        cowp = new Cow;
}

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

您希望修改驻留在向量中的指针,因此需要引用:

代码语言:javascript
复制
void add_new(Cow *& cowp)
{
  cowp = new Cow;
}

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

票数 4
EN

Stack Overflow用户

发布于 2013-07-31 12:33:33

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

另一个重要的更改是,您的函数必须引用指针:

代码语言:javascript
复制
void add_new(Cow*& cowp)

实际上,您实际上不需要使用std::for_each甚至std::transform,也不需要使用单独的创建函数,这要感谢新的C++11功能:

代码语言:javascript
复制
for (auto& cow : herd)
    cow = new Cow;

实际上,我建议您不要使用指针,这样就不需要其他初始化了。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17970458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档