首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何管理一系列gsl_vector

如何管理一系列gsl_vector
EN

Stack Overflow用户
提问于 2019-08-20 11:40:35
回答 1查看 60关注 0票数 0

我有一个作业要写一个迭代求解器(L-BFGS),它需要保存10个向量。并用最新的向量更新,同时删除最旧的向量。我正在使用gsl_vector进行所有其他计算,因此我想直接保存它们。

我首先想到的是使用vector、vector.push_back和vector.erase。但是我发现很难使用它,因为gsl_vector对象是由指针声明的。如果我push_back指针,我仍然必须保留指针变量,这与我手动管理保存的10个变量没有区别。

如果你能提供一些关于如何管理这种情况的指导,我们将不胜感激。

下面是一个简短的示例代码:

代码语言:javascript
运行
复制
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个指针变量来管理存储。

EN

Stack Overflow用户

回答已采纳

发布于 2019-08-20 12:51:51

我不明白为什么您需要保留指针变量,因为gsl_vector是堆分配的,您不需要在std::vector外部保留指向它的指针来保持它的活动状态。我建议使用带有自定义deleter的智能指针,以避免资源泄漏:

代码语言:javascript
运行
复制
#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());
    }
}
票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57566433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档