如何使用前后值对矢量进行变换

时间:2014-07-25 16:48:18

标签: c++ vector iterator

所以我试图找到迭代器左边和右边所有值的平均值到一个新的向量中。我想的是:

transform(begin(vector1)+1,end(vector2)-1, back_inserter           
(vector2),[](vector<int>::iterator n) {return (*(n - 1) + *(n) + *      
(n+1))/3;});

不幸的是,这给我一个关于转换参数的错误来自1'int' 到std :: vector_iterator

我将参数声明为矢量迭代器,但我必须做错事。我需要在lambda中或在使用函数中使用某些东西。我想知道如何做到这一点的正确方向,因为尝试寻找答案是痛苦的。也许如果有人问你之前你可以教我输入什么来找到这样的答案。

2 个答案:

答案 0 :(得分:1)

参数应该是向量的value_type(或者可以转换为它,就像const引用一样),所以它应该是int

答案 1 :(得分:1)

std::transform相当有限,因为它的目的是为了 实现双射 - 一个简单的一对一翻译。 将使用一个参数(值)调用该函数 目前在迭代器下,必须始终返回一个 元件。

功能对象可能具有状态,但是你 必须要小心,因为它具有价值语义,并且可以和 将被复制。你可以尝试这样的事情:

class Smoother
{
    std::vector<int>* m_previous;
public:
    Smoother( std::vector<int>& previous )
        : m_previous( previous )
    {
    }

    int operator()( int next )
    {
        int results = std::accumulate( m_previous->begin(), m_previous->end(), next ) / (m_previous->size() + 1);
        m_previous->erase( m_previous->begin() );
        m_previous->push_back( next );
        return retval;
    }
};

然后首先使用起始值初始化向量, 类似的东西:

std::vector<int> tmp( vector1.begin(), vector1.begin() + 2 );
std::transform( vector1.begin() + 2, vector1.end(), std::back_inserter( vector2 ), Smoother( tmp ) );

显然,像Smoother之类的东西可能是一个模板,你可以将整个事物很好地包装在一个函数中。 (更明显的是,如果你这样做,你需要更多的错误检查。)