我有一个作业要写一个迭代求解器(L-BFGS),它需要保存10个向量。并用最新的向量更新,同时删除最旧的向量。我正在使用gsl_vector进行所有其他计算,因此我想直接保存它们。
我首先想到的是使用vector、vector.push_back和vector.erase。但是我发现很难使用它,因为gsl_vector对象是由指针声明的。如果我push_back指针,我仍然必须保留指针变量,这与我手动管理保存的10个变量没有区别。
如果你能提供一些关于如何管理这种情况的指导,我们将不胜感激。
下面是一个简短的示例代码:
vector<gsl_vector*> storage(10);
gsl_vector* v = gsl_vector_alloc(100);
gsl_vector_set_zero(v);
storage.push_back(v);
if (storage.size()>10){
storage.erase(storage.begin());
}
gsl_vector_set_all(v, 1); //Could be any other computation
storage.push_back(v);
if (storage.size()>10){
storage.erase(storage.begin());
}
我想要的是将两个不同的向量保存到std::gsl_vector中。然而,由于gsl_vector是一个指针,最终我有了一个相同指针的向量,因此没有值被存储。如果我创建了10个指针对象,那么std::vector就没有用了,我仍然会通过这10个指针变量来管理存储。
发布于 2019-08-20 12:51:51
我不明白为什么您需要保留指针变量,因为gsl_vector
是堆分配的,您不需要在std::vector
外部保留指向它的指针来保持它的活动状态。我建议使用带有自定义deleter的智能指针,以避免资源泄漏:
#include <vector>
#include <memory>
#include <gsl/gsl_vector.h>
struct gls_vector_deleter {
void operator()(gsl_vector* v) {
gsl_vector_free(v);
}
};
int main()
{
using gsl_vector_ptr = std::unique_ptr<gsl_vector, gls_vector_deleter>;
std::vector<gsl_vector_ptr> storage(10);
gsl_vector_ptr v{ gsl_vector_alloc(100) };
gsl_vector_set_zero(v.get());
storage.push_back(std::move(v));
if (storage.size() > 10) {
storage.erase(storage.begin());
}
//can't use v anymore, lost ownership, use the one stored in vector or a new one
gsl_vector_ptr v2{ gsl_vector_alloc(100) };
gsl_vector_set_all(v2.get(), 1);
storage.push_back(std::move(v2));
if (storage.size() > 10) {
storage.erase(storage.begin());
}
}
https://stackoverflow.com/questions/57566433
复制相似问题