c++ - 无法将迭代器分配给二元函数中的常量输入 vector

标签 c++ vector binary-operators

我正在尝试编写一个二元函数,它接受两个 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 yconst 并返回一个 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/

相关文章:

c++ - 用于编辑文本框的 SDL

C++ STL:std::find 和 std::map

c++在一个函数参数中使用按位或 "|"的多个枚举

go - golang 数学/大库中的奇怪语法

ios - 二元运算符 '==' 不能应用于类型 'Any?' 和 'String' Swift iOS 的操作数

c++ - 我只想获得高质量的特征点

c++ - 获取 "error LNK2019: unresolved external symbol ... "

c++ - 无法在 C++ 中对类/对象的 vector 成员变量进行排序

c++ - vector 大小受 std::cin 影响?

c++ - 分配空 std::vector 是否与交换空 std::vector 相同?