我正在構建一個公開順序容器的類,具有固定長度,但在編譯時長度未知。
所以當我的類的一個實體被構造出來的時候,會傳入一個引數,來表示這個向量需要多大。
但長度需要在施工后固定。
我需要保證resize()
不能呼叫該函式,同時仍然允許我的代碼的其他部分修改向量中的各個元素。
(換句話說,我不能簡單地將向量公開為vector<T> const&
)
任何其他修改長度的函式也是如此,例如insert()
,push_back()
等。
這些函式需要被限制或隱藏。
這可能嗎?
還是我真的需要構建自己的fixed_vector
包裝類來隱藏不需要的功能?
uj5u.com熱心網友回復:
從 C 20 開始,您可以將 a 回傳std::span
到向量中的范圍。這允許訪問元素的大小和可修改的訪問,但不允許vector
' 修飾符。
例如:
#include<vector>
#include<span>
class A {
std::vector<int> vec;
public:
/*...*/
auto getVec() {
return std::span(vec);
}
};
回傳值可以作為一個范圍,但是不能訪問容器介面。
根據所需的型別和初始化,如果您知道大小不會改變,您也可以使用陣列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);
}
};
這可能會稍微節省空間,因為它不需要考慮向量大小和容量的差異。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/465382.html
上一篇:C ;將std::array隨機訪問迭代器作為函式引數傳遞
下一篇:使用cin使我的代碼無法正常作業