函数返回一个由向量组成的元组
Function return a tuple made of vectors
我正在努力避免函数中的输出参数。旧功能是:
void getAllBlockMeanError(
const vector<int> &vec, vector<int> &fact, vector<int> &mean, vector<int> &err)
这里vec
是输入自变量,fact
、mean
和err
是输出自变量。我试图将输出参数分组为一个元组:
tuple< vector<int>, vector<int>, vector<int> >
getAllBlockMeanErrorTuple(const vector<int> &vec)
{
vector<int> fact, mean, err;
//....
return make_tuple(fact, mean, err);
}
现在我可以用调用新函数
tie(fact, mean, err) = getAllBlockMeanErrorTuple(vec);
在我看来它更干净。虽然我有一个问题,tie(fact, mean, err)
的相等分配是如何工作的?它是深度复制还是移动?由于getAllBlockMeanErrorTuple
中的fact
、mean
和err
将被销毁,我希望它是在移动而不是深度复制。
您的函数签名是tuple< vector<int>, vector<int>, vector<int> >
,这是一个临时的,元素可以被移动,所以
std::tie(fact, mean, err) = getAllBlockMeanErrorTuple(vec)
应移动分配fact
、mean
和err
。
这里有一个示例程序供您自己查看(演示(:
#include <iostream>
#include <vector>
#include <tuple>
struct A
{
A() = default;
~A() = default;
A(const A&)
{
std::cout << "Copy ctorn";
}
A(A&&)
{
std::cout << "Move ctorn";
}
A& operator=(const A&)
{
std::cout << "Copy assignn";
return *this;
}
A& operator=(A&&)
{
std::cout << "Move assignn";
return *this;
}
};
std::tuple<A, A> DoTheThing()
{
A first;
A second;
return std::make_tuple(first, second);
}
int main()
{
A first;
A second;
std::tie(first, second) = DoTheThing();
}
输出:
复制ctor
复制ctor
移动分配
移动分配
请注意,函数必须创建向量的副本才能返回tuple
,这可能不是您想要的。您可能想要将元素std::move
转换为std::make_tuple
:
return make_tuple(std::move(fact), std::move(mean), std::move(err));
这是与上面相同的例子,但在make_tuple
中使用了std::move
请注意,使用C++17的结构化绑定,您可以完全忘记使用std::tie
,而更多地依赖auto
(谢谢,@Yakk(:
auto[fact, mean, err] = getAllBlockMeanErrorTuple(vec);
clang(3.8.0(和gcc(6.1.0(的C++17标准的早期实现还不支持它,但clang 4.0.0中似乎有一些支持:Demo(谢谢,@Revolver_Ocelot(
您会注意到,具有结构化绑定的输出更改为:
移动ctor
移动ctor
表示它们利用了拷贝省略,从而节省了额外的移动操作。
std::tie(fact, mean, err) = getAllBlockMeanErrorTuple(vec);
会做搬家作业。
但正如评论中提到的那样
return make_tuple(fact, mean, err);
你可以用来解决这个问题
return make_tuple(std::move(fact), std::move(mean), std::move(err));
相关文章:
- 将元组的向量转换/构造为堆
- 将元组的向量构造成堆
- 元组由 Swig 生成的 Python 包装器返回,用于C++向量
- 我正在寻找一种优雅的方式来从元组向量创建tuple_element向量
- 如何在元组初始化向量中删除样板?
- c++:交换向量中所有元组的第一个和第二个元素
- 如何在C++中创建元组向量?
- 返回两个向量 – 使用引用还是元组?
- 如何在具有特定条件的向量中删除所有元组?
- 使用 C++-17,如何从字符串向量填充元组
- C++ 按数值对元组<字符串、浮点数>然后按字典顺序排序的向量
- 如何将值元组中的相应值附加到相同类型的向量元组中
- 将可变参数模板包装到元组向量
- 从 c++ 中的字符串向量创建一个元组
- C++向量元组,请按索引从元素创建元组
- 从类型列表创建向量元组
- 如何打印类型向量<元组<字符串、int、int>> 以筛选 c++?
- 如何使用 C++11 可变参数模板来定义由向量元组支持的元组向量
- 初始化类成员初始值设定项列表中的向量元组
- 如何使用笛卡尔积将向量元组转换为元组的向量