我正在尝试编写一个二元函数,它接受两个 vector (相同长度)并按值相加。由于某种原因,以下代码不起作用:
struct Plusval : binary_function <std::vector<int>,std::vector<int>,std::vector<int> >
{
std::vector<int> operator() (const std::vector<int>& x, const std::vector<int>& y) const
{
std::vector<int> ret(x);
std::vector<int>::iterator itx,ity;
ity=y.begin();
for (itx=ret.begin();itx<ret.end();++itx)
{
ret[*itx]+=y[*ity];
++ity;
}
return ret;
}
};
我得到一个错误,我不能做 ity=y.begin() 但是,下面的代码确实有效
struct Plusval : binary_function <std::vector<int>,std::vector<int>,std::vector<int> >
{
std::vector<int> operator() (const std::vector<int>& x, const std::vector<int>& y) const
{
std::vector<int> ret(x);
std::vector<int> yloc(y);
std::vector<int>::iterator itx,ity;
ity=yloc.begin();
for (itx=ret.begin();itx<ret.end();++itx)
{
ret[*itx]+=yloc[*ity];
++ity;
}
return ret;
}
};
显然,第二个版本需要更长的时间(因为它必须复制一个额外的 vector )。是因为输入是一个常量 vector 吗?如果是,是否有任何理由需要这样做?请注意,如果有任何不同,我计划将此函数用作 boost::mpi 中 allreduce() 函数的输入
最佳答案
你将 ity
定义为 vector::iterator
y
是 const
并返回一个 const_iterator
。
更重要的是:不要使用binary_function
。适配器已被弃用。
此外,您的函数没有按照您的要求执行。 *itx 返回存储在 itx
指向的位置的值,您可以使用它来索引您打算返回的 vector
。
我会用二进制转换
来写这个。
std::vector<int> res;
std::transform(begin(x), end(x), begin(y),
std::back_inserter(res), std::plus<int>());
关于c++ - 无法将迭代器分配给二元函数中的常量输入 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10302504/