在C ++中,将一个函数的O / P提供给另一个函数的最佳方法是什么?

时间:2010-06-09 10:40:04

标签: c++ functional-programming

在这些条件下,

  1. 第一个程序的o / p是整数,双数或字符串的大数组。
  2. 最佳方法意味着x86架构上最快。

    • o / p表示输出。很抱歉不清楚。

3 个答案:

答案 0 :(得分:1)

如果你在谈论两个分开运行的程序,你可以使用A管道对象 在Windows中,您将使用`CreateNamedPipe()' http://msdn.microsoft.com/en-us/library/aa365150%28VS.85%29.aspx

答案 1 :(得分:1)

您可以将'other'函数赋予第一个函数以回调:

#include <algorithm>
#include <iostream>

template<typename It, typename It2, typename F1, typename F2> 
void combine( It from, It to, It2 out, F1 f1, F2 f2 ) {
    for( int* p = from; p != to; ++p ) {
       *(out++) =  f2( f1( *p ) );
    }
}

int increment( int i ){ return ++i; }

int twice( int i ){ return i+i; }

int main() {
 int ints[]={1,2,3,4};
 int result[4];

 combine( ints, ints+4, result, increment, twice );
 std::copy( result, result+4, std::ostream_iterator<int>( std::cout, "; " ) );

}

实际上,可以通过将函数转换为“第一类”对象来扩展此机制。 STL具有实现此目的的构造:如果将自由函数包装在ptr_fun对象中,则可以构造更好的组合函数。在SGI的STL实现中,compose功能可用。

#include <functional>


template<typename F1, typename F2>
struct Combined : public std::unary_function
                         < typename F1::argument_type
                         , typename F2::result_type > {

    typedef typename F2::result_type result_type;
    typedef typename F1::argument_type argument_type;

    Combined( F1 f1, F2 f2 ): f1_( f1 ), f2_( f2 ) {}

    result_type operator()( argument_type arg ) const {
        return f2_( f1_( arg ) );
    }

private:
    F1 f1_;
    F2 f2_;
};

template<typename F1, typename F2>
Combined<F1,F2> combined( F1 f1, F2 f2 ) { return Combined<F1,F2>(f1,f2); }

然后使用此功能更加通用地组合功能:

#include <iostream>
#include <iterator>
#include <algorithm>

int increment(int i){ return ++i; }
int twice(int i) { return 2*i; }

int main() {
    using namespace std;
    int values[]={1,2,3,4};

    transform( values, values+4, ostream_iterator<int>( cout, "; " ), 
               combined( ptr_fun( increment ), ptr_fun( twice ) )
        );
    transform( values, values+4, ostream_iterator<int>( cout, "; " ), 
               combined( ptr_fun( increment ), 
                         combined( ptr_fun( increment ), ptr_fun( twice ) ) )
        );

}

答案 2 :(得分:0)

如果你的意思是输出,那么只需将数组直接传递给下一个函数,并使用一个整数表示有多少元素。它将传递第一个元素的地址(32位系统上的4个字节或64位系统上的8个字节),然后以4个字节传递大小。

如果幸运的话,编译器甚至会通过寄存器传递这些参数。