提问者:小点点

将具有非常量元素的shared_ptr向量转换为具有常量元素的shared_ptr向量


我有一个类a,它包含一个向量shared_ptr。 我实现了这个向量的getter。 在某些情况下,最好确保B中的内容不发生变化(使B只读或成为常量引用)。

如果我没有使用vector>,而是使用vector,我可以简单地编写两个getter,一个返回常量引用(只读),另一个只返回引用(可能进行操作)。 #

有没有方法用向量>来做同样的事情?

也许在这段代码中更容易理解问题:

#include <vector>
#include <memory>
using namespace std;

class B{
public:
    explicit B(int i) : i_{i} {}
    void set_i(int i){i_ = i;}
private:
    int i_ = 0;
};

class A{
public:
    const vector<shared_ptr<B>> &get_vb(){return vb;}
    // const vector<shared_ptr<const B>> &get_vb_const(){return vb;} // I would like to return a const vector with const elements in some cases 
private:
    vector<shared_ptr<B>> vb{make_shared<B>(1), make_shared<B>(10), make_shared<B>(100)};
};

int main() {
    A a;
    const auto &vb = a.get_vb();
    vb[0]->set_i(2);
    
    // const auto &vb_const = a.get_vb_const(); // somehow I would like to gain this vector without being able to modify the elements
    // vb_const[0]->set_i(2); // should throw error
    
    return 0;
}

共2个答案

匿名用户

您需要用所需的元素构造一个新的向量:

    const vector<shared_ptr<const B>> get_vb_const() const { 
        return vector<shared_ptr<const B> > {vb.cbegin(), vb.cend()};
    }

请注意,该函数现在没有返回引用,因为我们正在创建一个临时函数并返回它。

匿名用户

将具有非常量元素的shared_ptr向量转换为具有常量元素的shared_ptr向量

您可以使用接受一对迭代器的vector的构造函数来执行转换。

通过为类实现自定义常量迭代器,可以避免分配和复制向量的开销。