代码之家  ›  专栏  ›  技术社区  ›  Giffyguy

如何限制在构造向量后调用'resize()'?

  •  0
  • Giffyguy  · 技术社区  · 3 年前

    我正在构建一个类,它公开一个固定长度的连续容器, 但编译时不知道长度。

    因此,在构造类的实例时,会传入一个参数,以指示向量需要有多大。

    但施工后需要固定长度。
    我要保证 resize() 函数无法调用,同时仍允许代码的其他部分修改向量中的单个元素。
    (换句话说,我不能简单地将向量公开为 vector<T> const& )

    这同样适用于任何其他修改长度的函数,例如 insert() , push_back()
    这些功能需要限制或隐藏。

    这可能吗?
    还是我真的需要建立自己的 fixed_vector 包装类来隐藏不需要的函数?

    1 回复  |  直到 3 年前
        1
  •  1
  •   user17732522    3 年前

    因为C++20可以返回 std::span 到向量中的范围。这允许访问大小和可修改的元素访问,但不允许访问 vector 的修饰符。

    例如:

    #include<vector>
    #include<span>
    
    class A {
        std::vector<int> vec;
    public:
        /*...*/
        auto getVec() {
            return std::span(vec);
        }
     };
    

    返回值可以用作范围,但无法访问容器接口。

    根据所需的类型和初始化,还可以使用阵列 std::unique_ptr 而不是 std::vector 如果你知道尺寸不会改变。然而,这并不能存储你需要存储自己的大小:

    #include<vector>
    #include<span>
    
    class A {
        std::size_t vec_size;
        std::unique_ptr<int[]> vec;
    public:
        A(std::size_t size) : vec_size(size), vec(std::make_unique<int[]>(size)) { }
    
        auto getVec() {
            return std::span(vec, vec_size);
        }
     };
    

    这可能更节省空间,因为它不需要考虑向量大小和容量的差异。