如何管理一系列gsl_vector
How to manage a series of gsl_vector
我有一个作业要编写一个需要保存 10 个向量的迭代求解器 (L-BFGS)。并使用最新的向量更新,同时删除最旧的向量。我正在使用 gsl_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());
}
我要的是把两个不同的gsl_vector存成std::vector。但是,由于 gsl_vector 是一个指针,最终我有一个相同指针的向量,因此没有存储任何值。如果我创建 10 个指针对象,那么 std::vector 就没用了,我仍将通过 10 个指针变量管理存储。
我不明白为什么你需要保留指针变量,gsl_vector
是堆分配的,你不需要在 std::vector
之外保留指向它的指针来保持它的存活.我的建议是使用带有自定义删除器的智能指针,以避免泄漏资源:
#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());
}
}
我有一个作业要编写一个需要保存 10 个向量的迭代求解器 (L-BFGS)。并使用最新的向量更新,同时删除最旧的向量。我正在使用 gsl_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());
}
我要的是把两个不同的gsl_vector存成std::vector。但是,由于 gsl_vector 是一个指针,最终我有一个相同指针的向量,因此没有存储任何值。如果我创建 10 个指针对象,那么 std::vector 就没用了,我仍将通过 10 个指针变量管理存储。
我不明白为什么你需要保留指针变量,gsl_vector
是堆分配的,你不需要在 std::vector
之外保留指向它的指针来保持它的存活.我的建议是使用带有自定义删除器的智能指针,以避免泄漏资源:
#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());
}
}