【问题标题】:Complex initialization for a const variable while avoiding new allocationconst 变量的复杂初始化,同时避免新分配
【发布时间】:2014-01-30 08:14:57
【问题描述】:

我正在尝试初始化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。但是,我对解决方法不感兴趣,而是对这个基本问题的优雅技术/实践感兴趣。如果初始化比计算向量中的某些索引更复杂怎么办?

【问题讨论】:

  • 这种函数的签名是什么?
  • std::string initStringconst 引用可以绑定到临时对象。
  • 但这也会为我想避免的返回值分配新字符串。我错过了什么?

标签: c++ reference initialization constants


【解决方案1】:

您可以使用函数或 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 行),我个人更喜欢这个函数,因为我喜欢我的 lambda 简短明了,但这取决于你。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 2017-05-01
    • 1970-01-01
    相关资源
    最近更新 更多