Gif*_*guy 5 c++ collections containers vector
我正在构建一个类,该类公开具有固定长度的顺序容器,但长度在编译时未知。
因此,当构造我的类的实例时,会传入一个参数,以指示向量需要有多大。
但施工后需要固定长度。
我需要保证该resize()函数无法被调用,同时仍然允许代码的其他部分修改向量中的各个元素。
(换句话说,我不能简单地将向量公开为vector<T> const&)
对于任何其他修改长度的函数也是如此,例如insert()、push_back()等。
这些函数需要受到限制或隐藏。
这可能吗?
或者我真的需要构建自己的fixed_vector包装类来隐藏不需要的功能吗?
从 C++20 开始,您可以将 a 返回std::span到向量中的范围。这允许访问大小和对元素的可修改访问,但不允许vector's 修饰符。
例如:
#include<vector>
#include<span>
class A {
std::vector<int> vec;
public:
/*...*/
auto getVec() {
return std::span(vec);
}
};
Run Code Online (Sandbox Code Playgroud)
返回值可以作为一个范围,但是无法访问容器接口。
根据所需的类型和初始化,如果您知道大小不会改变,您也可以使用数组std::unique_ptr而不是 a 。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);
}
};
Run Code Online (Sandbox Code Playgroud)
这可能会稍微提高空间效率,因为它不需要考虑向量大小和容量的差异。