Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;,无法将2个向量复制到对的向量_C++_Vector_Copy_Std Pair - Fatal编程技术网

C++ C++;,无法将2个向量复制到对的向量

C++ C++;,无法将2个向量复制到对的向量,c++,vector,copy,std-pair,C++,Vector,Copy,Std Pair,存在以下数据类型: struct Item { double a, b; Item (double a_, double b_): a(a_), b(b_){}}; typedef std::pair <double, Item> TPair; typedef std::vector <TPair> TData; struct Item{double a,b;Item(double a_,double b_):a(a_),b(b_){}; typedef std::对T

存在以下数据类型:

struct Item { double a, b; Item (double a_, double b_): a(a_), b(b_){}};
typedef std::pair <double, Item> TPair;
typedef std::vector <TPair> TData;
struct Item{double a,b;Item(double a_,double b_):a(a_),b(b_){};
typedef std::对TPair;
typedef std::vector TData;
我想将2个向量复制到成对向量中:

int main(int argc, char* argv[])
{
    std::vector <double> t1;
    std::vector <Item> t2;

    TData data;

    //Error
    std::transform (t1.begin(), t1.end(), data.begin(), 
            std::bind2nd( std::ptr_fun( std::make_pair <double,Item > ), double() ) );
}
intmain(intargc,char*argv[])
{
std::向量t1;
std::载体t2;
TData数据;
//错误
std::transform(t1.begin()、t1.end()、data.begin(),
std::bind2nd(std::ptr_-fun(std::make_-pair),double());
}
但编译器会因以下错误而停止:

Error   1   error C2784: 'std::pointer_to_binary_function<_Arg1,_Arg2,_Result,_Result(__fastcall *)(_Arg1,_Arg2)> 
std::ptr_fun(_Result (__fastcall *)(_Arg1,_Arg2))' : could not deduce template argument for 'overloaded function type' from 'overloaded function type'
Error   2   error C2784: 'std::pointer_to_binary_function<_Arg1,_Arg2,_Result,_Result(__fastcall *)(_Arg1,_Arg2)> 
std::ptr_fun(_Result (__fastcall *)(_Arg1,_Arg2))' : could not deduce template argument for 'overloaded function type' from 'overloaded function type'
错误1错误C2784:'std::指向二进制函数的指针
std::ptr_fun(_Result(u fastcall*)(_Arg1,_Arg2)):无法从“重载函数类型”推断“重载函数类型”的模板参数
错误2错误C2784:“std::指针指向二进制函数”
std::ptr_fun(_Result(u fastcall*)(_Arg1,_Arg2)):无法从“重载函数类型”推断“重载函数类型”的模板参数
问题在哪里?谢谢你的帮助。编译器MSVS2010 x86。我更喜欢一个没有助推的解决方案

更新的问题 dasblinkenlight发现错误,更正代码为:

std::transform (t1.begin(), t1.end(), data.begin(), std::bind1st( std::ptr_fun( std::make_pair <double,Item > ), double() ) );
std::transform(t1.begin()、t1.end()、data.begin()、std::bind1st(std::ptr_-fun(std::make_-pair)、double());

但是编译器显示了相同的错误…

std::make_pair的第二个参数是
项,而不是
双参数。我想您应该改用
std::bind1st

std::make\u pair
的第二个参数是
项,而不是
双参数。我想你应该改用
std::bind1st
make\u pair
的第二个参数是
Item
,而不是
double

std::transform (t1.begin(), t1.end(), data.begin(),
     std::bind2nd( std::ptr_fun( std::make_pair <double,Item > ), Item(0,0) ) );
然后调用如下所示:

std::transform (t1.begin(), t1.end(), data.begin(),
     std::bind2nd( std::ptr_fun<double,Item,std::pair<double,Item> >( make_pair), Item(0,0) ) );
std::transform(t1.begin(),t1.end(),data.begin(),
std::bind2nd(std::ptr_-fun(配对),项目(0,0));

组合对的第二个参数是
项,而不是
双参数

std::transform (t1.begin(), t1.end(), data.begin(),
     std::bind2nd( std::ptr_fun( std::make_pair <double,Item > ), Item(0,0) ) );
然后调用如下所示:

std::transform (t1.begin(), t1.end(), data.begin(),
     std::bind2nd( std::ptr_fun<double,Item,std::pair<double,Item> >( make_pair), Item(0,0) ) );
std::transform(t1.begin(),t1.end(),data.begin(),
std::bind2nd(std::ptr_-fun(配对),项目(0,0));

您不应该使用不推荐使用的活页夹,因为它们只会 在你撞上一些基本上 无法求解(具有多个参数的成员函数,多个 超过2个参数,未知返回类型),并且它们与不兼容 C++11lambdas。用于某种程度的前向兼容性
boost::bind
。您的代码有效地变成:

boost::bind(make_pair<double, Item>, double(), _1);
奇怪的是,它不是在4.6.2上用C++11编译的。我没有 我还没弄明白原因。但把它作为一个很好的例子,为什么你不应该
使用不推荐使用的活页夹

您不应该使用不推荐使用的活页夹,因为它们只会 在你撞上一些基本上 无法求解(具有多个参数的成员函数,多个 超过2个参数,未知返回类型),并且它们与不兼容 C++11lambdas。用于某种程度的前向兼容性
boost::bind
。您的代码有效地变成:

boost::bind(make_pair<double, Item>, double(), _1);
奇怪的是,它不是在4.6.2上用C++11编译的。我没有 我还没弄明白原因。但把它作为一个很好的例子,为什么你不应该
使用不推荐使用的活页夹

您使用的是哪种编译器?在最新的编译器(即lambda表达式)上有更简单的方法来实现这一点。您使用的是哪种编译器?在最新的编译器(即lambda表达式)上有更简单的方法来实现这一点。@R.MartinhoFernandes好,为了使用
bind1st
,他需要将
t1
替换为
t2
。我不太清楚OP为什么要使用transform,因为很难使用它将两个向量“压缩”在一起。我想要一个
for
循环:)@dasblinkenlight还有一个二进制版本的
std::transform
,它非常适合压缩。我不明白为什么C++11没有添加n元形式。对我来说,这听起来像是一个提议。@justik这很奇怪,因为我从一个我刚刚用g++编译的程序中提取了这个片段。这里它是开着的。@dasblinkenlight:VS2010下的这段代码不起作用,仍然是相同的错误:-(.语法highliting与std::ptr_-fun有问题…在另一段代码中,包含std::ptr_-fun的构造工作得很好…@justik我明白你的意思了(只是将代码复制到VS中,它不编译)。问题似乎是
make_pair
引用了第二个参数,MS编译器似乎对此有问题。请参阅我的更新。@R.MartinhoFernandes,为了使用
bind1st
,他需要将
t1
替换为
t2
。我不太清楚OP为什么要使用transform,是吗因为很难用它将两个向量“压缩”在一起。我会选择一个
for
循环:)@dasblinkenlight还有一个二进制版本的
std::transform
,非常适合压缩。我不明白为什么C++11没有添加n元形式。对我来说,这听起来像是一个提议。@justik这很奇怪,因为我从一个我刚刚用g++编译的程序中提取了这个片段。这里它是开着的。@dasblinkenlight:VS2010下的这段代码不起作用,仍然是相同的错误:-(.语法highliting与std::ptr_-fun有问题…在另一段代码中,包含std::ptr_-fun的构造工作得很好…@justik我明白你的意思了(只是将代码复制到VS中,它不编译)。问题似乎是,
make_pair
引用了它的第二个参数,而MS编译器似乎对此有问题。请参阅我的更新。有没有没有没有Boost的解决方案?@justik每个现代编译器都有一个
TR1
实现,它有一个
std::bind
。有没有Boost的解决方案吗?@justik每一个现代编译器都有