const变量的复杂初始化,同时避免新的分配

时间:2014-01-30 08:14:57

标签: c++ reference initialization const

我正在尝试初始化const&变量。我试图初始化的变量的值取决于某些条件 例如:

typedef std::vector<string> string_vector;
string_vector data_pool;

const string& data;
if( some_cond )
  {
    // do something and set data
    data = data_pool[some_index1]
  }
 else
   {
     // do something and set data
    data = data_pool[some_index2]
   }

当然上面的代码无效,但这正是我要做的。

我可以使用ternary operator

const string& data = (some_cond)? data_pool[some_index1] : data_pool[some_index2];

但是这个语法实际上并没有让我做任何事情来设置值。

所以现在我尝试使用lambda expression(不太确定我做对了):

const string& data = [&]{

    string tmp = "";  
      {
        // do something and set tmp
        tmp = data_pool[some_index1]
      }
    else
      {
        // do something and set tmp
        tmp = data_pool[some_index2]
      }

    return tmp;
}

但我的问题是这个解决方案需要新的字符串分配,这是我现在买不起的,因为这段代码是我程序的瓶颈。

问题
data如何以复杂的方式初始化但有效

注意
我可以很容易地解决问题。 data最终将引用data_pool中的某个项目,因此我需要做的就是计算所需的索引,然后初始化data。但是我对解决方法不感兴趣,而是对这个基本问题的优雅技术/实践感兴趣。如果初始化比计算向量中的某个索引要复杂一点怎么办?

1 个答案:

答案 0 :(得分:2)

你可以使用函数或lambda来做到这一点。可以完成这两个解决方案,以便不执行任何分配,并且const引用实际上对data_pool中存在的数据进行别名。

有了一个功能,那就是:

const std::string& initConstString(string_vector& pool){
    std::size_t index;

    //complex initialization stuff

    return pool[index];
}

使用lambda:

auto lambda = [&data_pool]() -> const std::string&{
    std::size_t index = 0;//For the sake of example
    //perform initialization here
    return data_pool[index];
};

const std::string& constString = lambda();

Live example for the lambda version on Coliru

我个人更喜欢这个功能,如果初始化代表很多(好吧,> 4-5行),因为我喜欢我的lambdas简洁明了,但这取决于你。