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