如何管理一系列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());
    }
}