我想在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行遇到了运行时“分段错误”错误。牧群向量似乎未被启用。为什么呢?
答案 0 :(得分:8)
您的函数按值获取指针,然后重新分配这些副本。您需要通过引用将它们引入以影响向量中的指针。
void add_new(Cow *& cowp)
答案 1 :(得分:4)
void add_new(Cow* cowp)
{
cowp = new Cow;
}
您只修改Cow
指针的本地版本。请记住,在离开函数时会破坏局部变量,此处指针将作为值传递!
您想要修改驻留在向量中的指针,因此需要引用:
void add_new(Cow *& cowp)
{
cowp = new Cow;
}
这样,您就可以有效地修改驻留在向量中的原始指针。
答案 2 :(得分:2)
对于这个std::generate
是一个更好的匹配,因为它应该用于生成序列。
另一个重要的变化是你的函数必须将引用带到指针:
void add_new(Cow*& cowp)
实际上,由于新的C ++ 11功能,您实际上不需要使用std::for_each
甚至std::transform
,或使用单独的创建函数:
for (auto& cow : herd)
cow = new Cow;
我实际上会建议你不使用指针,所以不需要其他初始化。