【问题标题】:How to use transform with a vector using the before and after values如何使用前值和后值对向量进行变换
【发布时间】:2014-07-25 16:48:17
【问题描述】:

所以我试图将迭代器左右所有值的平均值找到一个新向量。我在想类似的东西:

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 或在函数中使用某些东西时这样做。我想至少指出如何做到这一点的正确方向,因为尝试寻找答案是一件很痛苦的事情。也许如果在你能教我输入什么来找到这样的答案之前已经问过这个问题。

【问题讨论】:

    标签: c++ vector iterator


    【解决方案1】:

    参数应该是向量的value_type(或者可以转换成它,比如const引用),所以它应该是int

    【讨论】:

    • 那么我该如何去改变 的参数,但是迭代到当前位置之前和之后的值呢?
    • 我不认为std::transform 是适合它的工具。即使您以某种方式构造函数对象来执行您想要的操作,结果也将比使用 for(;;) 的显式循环可读性差得多。
    【解决方案2】:

    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 这样的东西可以是一个模板,你可以把整个东西很好地包装在一个函数中。 (更明显的是,如果你这样做了,你会想要更多的错误检查。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-19
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      相关资源
      最近更新 更多