使用临时对象而不将其存储在变量中
Using a temporary object without storing it in variable
举个例子,我们需要将从一个函数返回的向量插入另一个向量:
const std::vector<int> getvec(){
return {1, 2, 3};
}
// in main...
std::vector<int> foo{ 11, 12 };
auto bar = getvec();
foo.insert(foo.end(), bar.begin(), bar.end());
bar
变量需要在 insert()
方法中引用两次这一事实使得有必要将向量存储为变量(否则我们可以 foo.myinsert(getvec())
应该有这么一个界面)。
让我有点恼火的是,在这种情况下,我们需要在主作用域中引入一个变量 foo
,这并不意味着在其余代码中再次使用,因为它占用内存,也污染命名空间。如果我们谈论的是一个大的“临时”对象,这尤其是一个问题。
是否有处理该问题的标准方法?我们可以定义一个只获取“临时”对象一次的函数,这样我们就可以直接将函数输出提供给它,但是如果我们需要为每个类似的场景定义这样的函数,将很难管理。同样在这个例子中,我们无法为 vector
class.
定义成员函数
或者使用大括号来限制插入的“临时”部分的范围,但我想知道这里是否有任何警告。
vector<int> foo{ 11, 12 };
{ // extra brace here
auto bar = getvec();
foo.insert(foo.end(), bar.begin(), bar.end());
} // extra brace here
这不是最漂亮的解决方案,但您可以使用临时 lambda 而不是单独的函数,并且在同一语句中声明和调用它可以避免使用大括号来限制其范围。
const std::vector<int> getvec(){
return {1, 2, 3};
}
// in main...
std::vector<int> foo{ 11, 12 };
[&](const auto &bar){ foo.insert(foo.end(), bar.begin(), bar.end()); }(getvec());
您可以编写一个小模板函数来执行此操作,它通过 const 引用获取一个向量(它可以绑定到一个临时对象并延长其生命周期):
template<typename C>
void append(std::vector<C> &invec, const std::vector<C> &temp)
{
invec.insert(std::end(invec), std::begin(temp), std::end(temp));
}
这可以用于所有其他类型的向量。然后你可以这样称呼它:
append(foo, getvec());
工作演示here。
您可以使用除 char 之外的其他内容来创建字符串。通过 basic_string<int>
,您可以访问 string::append
(以及其他内容)
using strint = std::basic_string<int>;
strint getVec () {
return { 1, 2, 3, 4, 5 };
}
strint foo{ 6, 7 };
foo += getVec();
举个例子,我们需要将从一个函数返回的向量插入另一个向量:
const std::vector<int> getvec(){
return {1, 2, 3};
}
// in main...
std::vector<int> foo{ 11, 12 };
auto bar = getvec();
foo.insert(foo.end(), bar.begin(), bar.end());
bar
变量需要在 insert()
方法中引用两次这一事实使得有必要将向量存储为变量(否则我们可以 foo.myinsert(getvec())
应该有这么一个界面)。
让我有点恼火的是,在这种情况下,我们需要在主作用域中引入一个变量 foo
,这并不意味着在其余代码中再次使用,因为它占用内存,也污染命名空间。如果我们谈论的是一个大的“临时”对象,这尤其是一个问题。
是否有处理该问题的标准方法?我们可以定义一个只获取“临时”对象一次的函数,这样我们就可以直接将函数输出提供给它,但是如果我们需要为每个类似的场景定义这样的函数,将很难管理。同样在这个例子中,我们无法为 vector
class.
或者使用大括号来限制插入的“临时”部分的范围,但我想知道这里是否有任何警告。
vector<int> foo{ 11, 12 };
{ // extra brace here
auto bar = getvec();
foo.insert(foo.end(), bar.begin(), bar.end());
} // extra brace here
这不是最漂亮的解决方案,但您可以使用临时 lambda 而不是单独的函数,并且在同一语句中声明和调用它可以避免使用大括号来限制其范围。
const std::vector<int> getvec(){
return {1, 2, 3};
}
// in main...
std::vector<int> foo{ 11, 12 };
[&](const auto &bar){ foo.insert(foo.end(), bar.begin(), bar.end()); }(getvec());
您可以编写一个小模板函数来执行此操作,它通过 const 引用获取一个向量(它可以绑定到一个临时对象并延长其生命周期):
template<typename C>
void append(std::vector<C> &invec, const std::vector<C> &temp)
{
invec.insert(std::end(invec), std::begin(temp), std::end(temp));
}
这可以用于所有其他类型的向量。然后你可以这样称呼它:
append(foo, getvec());
工作演示here。
您可以使用除 char 之外的其他内容来创建字符串。通过 basic_string<int>
,您可以访问 string::append
(以及其他内容)
using strint = std::basic_string<int>;
strint getVec () {
return { 1, 2, 3, 4, 5 };
}
strint foo{ 6, 7 };
foo += getVec();