使用std :: transform制作一对向量

Luc*_*gla 6 c++ std c++11

我想vector从一对vectors 创建一对。例如,如果Ais std::vector A = [1 0 1]Bis std::vector B = [0 1 0],我想要一个std::vector C = [1 0, 0 1, 1 0]where 的结构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());
Run Code Online (Sandbox Code Playgroud)

这导致我出现编译器错误:

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());
Run Code Online (Sandbox Code Playgroud)

消息很清楚,但是我不知道什么传递给二进制运算符。我必须承认我没有一个清晰的了解,std::transform()我只是将其与函子一起使用。

lub*_*bgr 7

您传入的二进制操作没有任何意义。std::make_pair是带有两个参数的函数模板,因此如果没有这两个参数就不能调用它,也不能像要传递给的函数对象一样实例化它std::transform

相反,您可以显式实例化所std::make_pair涉及的模板类型,并将其传递给算法(@RetiredNinja指出了这一点,但显然太懒了,无法编写答案):

std::transform(boolRealLabel.cbegin(), boolRealLabel.cend(),
    boolPredLabel.cbegin(), TrPrPair.begin(), std::make_pair<bool, bool>);
Run Code Online (Sandbox Code Playgroud)

常见的两个其他选择是lambda,

std::transform(boolRealLabel.cbegin(), boolRealLabel.cend(), boolPredLabel.cbegin(),
    TrPrPair.begin(), [](bool a, bool b){ return std::make_pair(a, b); });
Run Code Online (Sandbox Code Playgroud)

或指向函数的指针

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);
Run Code Online (Sandbox Code Playgroud)

为了完整起见,请使用cppreference on std::transform及其二进制操作参数(仅与作用于两个输入范围的重载有关):

binary_op-将要应用的二进制操作函数对象。

该函数的签名应等效于以下内容:

Ret fun(const Type1 &a, const Type2 &b); 
Run Code Online (Sandbox Code Playgroud)