[英]Make variable unchangeable without copying in C++
我正在編寫一些代碼,在這些代碼中,在指定值之前聲明了std::vector<double>
類型的變量。 我無法與聲明一起定義值,因為它需要多行代碼來設置值。 問題在於,這個變量本質上是一個常量,這意味着它一旦設置就不應該被修改。 但是,它不能聲明為const
。
一種方法是創建另一個const
變量並將值復制到其中。 const std::vector<double> a(b);
會這樣做,並在程序中使用a
而不是b
。 但是,我的變量可能很大,我希望學習除了必須執行復制之外的其他方法。
你們有什么建議嗎?
您可以創建一個函數來初始化它。 在最壞的情況下,你有一個move
。 充其量你有(N)RVO(返回值優化)。
std::vector<Object> CreateBigVector();
接着
const std::vector<Object> myObject = CreateBigVector();
我認為問題在於范圍界定 。 您必須將問題分成兩個不同的范圍 :
在構建 vector
的范圍內,它在邏輯上不是const變量。 一旦你構建它,你希望它不再被改變。 所以你可能想通過const &
引用它。
我會這樣走:
std::vector<double> build_up()
build_up
,你定義了一個非const vector
,你可以構建它 build_up()
返回的對象稱為const對象 即
const std::vector<double> v = build_up();
一種方法是創建一個函數
std::vector<Object> CreateYourVector();
並用它來初始化
const std::vector<Object> vec = CreateYourVector();
另一個(技術上是一種變體)是創建一個包含vector的輔助類,並在構造函數中完成所有工作
class Helper
{
std::vector<Object> vec;
public:
Helper()
{
// initialise your vector here
};
const std::vector<Object> &TheVec() const {return vec;};
};
const Helper helper;
可以組合上述技術,例如改變構造函數
Helper() : vec(CreateYourVector()) {};
這些技術也可以與其他技術混合,例如單例模式。
在c++11
,您可以使用initial list
來定義const vector
。 我認為這是最簡單的方法。 試一試: const vector<double> = {1.0, 2.0, 3.0};
。 設置值不需要多行代碼。 我希望這可以幫到你。
傳統的方法是僅公開一個強制執行const的句柄,並避免在創建和初始化向量的上下文之外制作昂貴的副本。 這樣的句柄將是一個const指針或引用。
由於你使用的是std::vector
你可以從現代的c ++工具中受益,因為std::vector
支持像現成的移動語義這樣的功能。
特別是,我建議您預算一段時間來查看:
它改進了傳遞原始指針的傳統方式。 它們強制執行所有權語義(該上下文擁有該對象),並允許您通過代碼以非常精確的方式表達您的意圖。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.