C++:修改 share_ptr 个元素的向量
C++: Modify a vector of share_ptr elements
在C++程序中,我这样声明一个变量e:
shared_ptr<c_t> e = shared_ptr<c_t> (new c_t);
然后,e被初始化。
稍后在程序中,我想调整e的大小,使用这个函数:
e->change(4);
其中 class c_t 和函数 c_t::change 被定义如:
class c_t {
public:
vector<shared_ptr<double>> m;
void change(int n) {
vector<shared_ptr<c_double>> mm;
shared_ptr<double> m_buffer = make_shared<c_double>();
for(int i = 0; i < n; i++) {
m_buffer = 3.14 * i;
mm.push_back(m_buffer);
};
m = mm;
};
};
但是,这种方法行不通。当我使用迭代器读取 e 时,我得到 e 的值是 inf。为什么?我应该如何更改 e?
编辑:
要阅读,实际上要缩放,e 的值,class c_t 使用此函数:
void scaling(double factor) {
for (auto it = m.begin(); it != m.end(); ++it) {
m *= factor;
};
};
您尝试使用 vector::assign 了吗?
m.assign(newSize, m_buffer);
m_buffer = 3.14 * i;
m_buffer
是 std::shared_ptr
类型。你的分配没有意义。你可能想写:
*m_buffer = 3.14 * i;
您还想在 for 循环内声明 m_buffer
,这样向量中的值将根据 i
.
具有不同的值
for(int i = 0; i < n; i++)
{
std::shared_ptr<double> m_buffer = std::make_shared<double>();
*m_buffer = 3.14 * i;
mm.push_back(m_buffer);
};
或更短的版本:
for(int i = 0; i < n; i++)
{
mm.push_back(std::make_shared<double>(3.14 * i));
};
在C++程序中,我这样声明一个变量e:
shared_ptr<c_t> e = shared_ptr<c_t> (new c_t);
然后,e被初始化。
稍后在程序中,我想调整e的大小,使用这个函数:
e->change(4);
其中 class c_t 和函数 c_t::change 被定义如:
class c_t {
public:
vector<shared_ptr<double>> m;
void change(int n) {
vector<shared_ptr<c_double>> mm;
shared_ptr<double> m_buffer = make_shared<c_double>();
for(int i = 0; i < n; i++) {
m_buffer = 3.14 * i;
mm.push_back(m_buffer);
};
m = mm;
};
};
但是,这种方法行不通。当我使用迭代器读取 e 时,我得到 e 的值是 inf。为什么?我应该如何更改 e?
编辑: 要阅读,实际上要缩放,e 的值,class c_t 使用此函数:
void scaling(double factor) {
for (auto it = m.begin(); it != m.end(); ++it) {
m *= factor;
};
};
您尝试使用 vector::assign 了吗?
m.assign(newSize, m_buffer);
m_buffer = 3.14 * i;
m_buffer
是 std::shared_ptr
类型。你的分配没有意义。你可能想写:
*m_buffer = 3.14 * i;
您还想在 for 循环内声明 m_buffer
,这样向量中的值将根据 i
.
for(int i = 0; i < n; i++)
{
std::shared_ptr<double> m_buffer = std::make_shared<double>();
*m_buffer = 3.14 * i;
mm.push_back(m_buffer);
};
或更短的版本:
for(int i = 0; i < n; i++)
{
mm.push_back(std::make_shared<double>(3.14 * i));
};