使用 std::transform 制作对向量
Using std::transform to make a vector of pair
我想从一对 vector
开始创建一对 vector
。例如,如果 A
是 std::vector A = [1 0 1]
并且 B
是 std::vector B = [0 1 0]
,我想要一个结构 std::vector C = [1 0, 0 1, 1 0]
其中 C_i = std::pair(A_i,B_i)
.
我会避免 for
循环遍历两个向量,所以我正在寻找像 std::transform()
.
这样的几行代码
我尝试了以下代码:
std::vector<bool> boolPredLabel(tsLabels.size());
std::vector<bool> boolRealLabel(tsLabels.size());
std::vector<std::pair<bool,bool>> TrPrPair(tsLabels.size());
std::transform(boolRealLabel.begin(), boolRealLabel.end(), boolPredLabel.begin(), TrPrPair.begin(),std::make_pair());
这导致我出现编译器错误:
error: no matching function for call to ‘make_pair()’
std::transform(boolRealLabel.begin(), boolRealLabel.end(), boolPredLabel.begin(), TrPrPair.begin(),std::make_pair());
...
note: candidate expects 2 arguments, 0 provided
std::transform(boolRealLabel.begin(), boolRealLabel.end(), boolPredLabel.begin(), TrPrPair.begin(),std::make_pair());
消息很清楚,但我不知道传递给二元运算符的是什么。我不得不承认我对 std::transform()
没有一个清晰的理解,我只是把它和 functor 一起使用。
你传入的二元运算没有任何意义。 std::make_pair
是一个带两个参数的函数模板,所以没有这两个参数就不能调用它,也不能像传递给 std::transform
.
的函数对象一样实例化它
相反,您可以为有问题的模板类型显式实例化 std::make_pair
,并将其传递给算法(@RetiredNinja 指出了这一点,但显然懒得写答案):
std::transform(boolRealLabel.cbegin(), boolRealLabel.cend(),
boolPredLabel.cbegin(), TrPrPair.begin(), std::make_pair<bool, bool>);
另外两个常见的选项是 lambda,
std::transform(boolRealLabel.cbegin(), boolRealLabel.cend(), boolPredLabel.cbegin(),
TrPrPair.begin(), [](bool a, bool b){ return std::make_pair(a, b); });
或指向函数的指针
std::pair<bool, bool> toPair(bool a, bool b)
{
return std::make_pair(a, b);
}
std::transform(boolRealLabel.cbegin(), boolRealLabel.cend(),
boolPredLabel.cbegin(), TrPrPair.begin(), toPair);
为了完整起见,cppreference on std::transform
及其二元运算参数(仅与作用于两个输入范围的重载相关):
binary_op - binary operation function object that will be applied.
The signature of the function should be equivalent to the following:
Ret fun(const Type1 &a, const Type2 &b);
我想从一对 vector
开始创建一对 vector
。例如,如果 A
是 std::vector A = [1 0 1]
并且 B
是 std::vector B = [0 1 0]
,我想要一个结构 std::vector C = [1 0, 0 1, 1 0]
其中 C_i = std::pair(A_i,B_i)
.
我会避免 for
循环遍历两个向量,所以我正在寻找像 std::transform()
.
我尝试了以下代码:
std::vector<bool> boolPredLabel(tsLabels.size());
std::vector<bool> boolRealLabel(tsLabels.size());
std::vector<std::pair<bool,bool>> TrPrPair(tsLabels.size());
std::transform(boolRealLabel.begin(), boolRealLabel.end(), boolPredLabel.begin(), TrPrPair.begin(),std::make_pair());
这导致我出现编译器错误:
error: no matching function for call to ‘make_pair()’
std::transform(boolRealLabel.begin(), boolRealLabel.end(), boolPredLabel.begin(), TrPrPair.begin(),std::make_pair());
...
note: candidate expects 2 arguments, 0 provided
std::transform(boolRealLabel.begin(), boolRealLabel.end(), boolPredLabel.begin(), TrPrPair.begin(),std::make_pair());
消息很清楚,但我不知道传递给二元运算符的是什么。我不得不承认我对 std::transform()
没有一个清晰的理解,我只是把它和 functor 一起使用。
你传入的二元运算没有任何意义。 std::make_pair
是一个带两个参数的函数模板,所以没有这两个参数就不能调用它,也不能像传递给 std::transform
.
相反,您可以为有问题的模板类型显式实例化 std::make_pair
,并将其传递给算法(@RetiredNinja 指出了这一点,但显然懒得写答案):
std::transform(boolRealLabel.cbegin(), boolRealLabel.cend(),
boolPredLabel.cbegin(), TrPrPair.begin(), std::make_pair<bool, bool>);
另外两个常见的选项是 lambda,
std::transform(boolRealLabel.cbegin(), boolRealLabel.cend(), boolPredLabel.cbegin(),
TrPrPair.begin(), [](bool a, bool b){ return std::make_pair(a, b); });
或指向函数的指针
std::pair<bool, bool> toPair(bool a, bool b)
{
return std::make_pair(a, b);
}
std::transform(boolRealLabel.cbegin(), boolRealLabel.cend(),
boolPredLabel.cbegin(), TrPrPair.begin(), toPair);
为了完整起见,cppreference on std::transform
及其二元运算参数(仅与作用于两个输入范围的重载相关):
binary_op - binary operation function object that will be applied.
The signature of the function should be equivalent to the following:
Ret fun(const Type1 &a, const Type2 &b);