我正在处理一些代码,在这些代码中,在指定值之前声明了std::vector<double>
类型的变量。我无法与声明一起定义值,因为需要多行代码来设置值。问题在于,这个变量本质上是一个常数,意味着它一旦被设置就不应该被修改。但是,它无法声明const
。
一种方法是创建另一个const
变量并将值复制到其中。 const std::vector<double> a(b);
会这样做,并在程序中使用a
代替b
。但是,我的变量可能很大,我希望学习除了必须执行复制之外的其他方法。
你们有什么建议吗?
答案 0 :(得分:8)
您可以创建一个函数来初始化它。最糟糕的是,你有一个move
。充其量你有(N)RVO(返回值优化)。
std::vector<Object> CreateBigVector();
然后
const std::vector<Object> myObject = CreateBigVector();
答案 1 :(得分:1)
我认为问题在于范围。您必须将问题分成两个不同的范围:
在构建 vector
的范围内,它在逻辑上不是const变量。一旦你构建它,你希望它不再被改变。所以你可能想通过const &
来引用它。
我会这样:
std::vector<double> build_up()
build_up
内,您定义了一个非const vector
,您可以构建它build_up()
返回的对象称为 const 对象即
const std::vector<double> v = build_up();
答案 2 :(得分:1)
一种方法是创建一个函数
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()) {};
这些技术也可以与其他技术混合使用,例如单例模式。
答案 3 :(得分:0)
在c++11
中,您可以使用initial list
来定义const vector
。我认为这是最简单的方法。试一试:const vector<double> = {1.0, 2.0, 3.0};
。设置值不需要多行代码。我希望这可以帮到你。
答案 4 :(得分:0)
传统的方法是仅公开一个强制执行const的句柄,并避免在创建和初始化向量的上下文之外制作昂贵的副本。这样的句柄将是一个const指针或引用。
由于您使用std::vector
,您可以从现代c ++工具中受益,因为std::vector
支持现有的移动语义等功能。
特别是,我建议您预算一段时间来查看:
升级传统的原始指针传递方式。它们强制执行所有权语义(上下文拥有该对象),并允许您通过代码以非常精确的方式表达您的意图。