Udostępnij za pośrednictwem


adjacent_difference and vector::push_back

Illustrates how to use the adjacent_difference and vector::push_back Standard Template Library (STL) functions in Visual C++.

template<class InputIterator, class OutputIterator> inline
   OutputIterator adjacent_difference(
      InputIterator First, 
      InputIterator Last, 
      OutputIterator Result
   )
template<class InputIterator, class OutputIterator, class BinaryOperator> inline
   OutputIterator adjacent_difference(
      InputIterator First, 
      InputIterator Last, 
      OutputIterator Result,
      BinaryOperator Binary_Op
   )

Remarks

Note

The class/parameter names in the prototype do not match the version in the header file. Some have been modified to improve readability.

Assigns to every element referred to by iterator i in the range [Result + 1, Result + (Last - First)) a value correspondingly equal to *(First + (i - Result)) - *(First + (i - Result) - 1) or Binary_Op (*(First + (i - Result)), *(First + (i - Result) - 1)). Result gets the value of *First.

Example

// adj_diff.cpp
// compile with: /EHsc
// 
// Description of adjacent_difference(first,last,result)
//                adjacent_difference(first,last,result,binary_op):
//
//    Assigns to every element referred to by iterator i in the range
//    [result + 1, result + (last - first))
//    a value correspondingly equal to
//    *(first + (i - result)) - *(first + (i - result) - 1)
//    or
//    binary_op(*(first + (i - result)), *(first + (i - result) - 1)).
//    Result gets the value of *first.

#include <iostream>
#include <numeric>
#include <functional>
#include <vector>
#include <iterator>

using namespace std;


typedef vector < int > IntegerArray;
typedef ostream_iterator < int, char, char_traits<char> > IntOstreamIt;

int main ()
{
    // an ostream iterator that outputs an int to cout terminated
    // by a space
    IntOstreamIt itOstream(cout," ");

    // Initialize the array
    // Suppose that you are taking a trip and can measure
    // the miles traveled from your city of origin
    // to the city you are traveling through
    IntegerArray rgIA;
    rgIA.push_back(5661); // San Francisco to Berlin
    rgIA.push_back(7456); // to Cairo
    rgIA.push_back(10995); // to Kolkata
    rgIA.push_back(17019); // to Cape Town
    rgIA.push_back(24394); // to Hong Kong
    rgIA.push_back(30376); // to London
    rgIA.push_back(35758); // to Los Angeles

    // Print the array
    copy(rgIA.begin(),rgIA.end(),itOstream);
    cout << endl;

    // Suppose that you now want the distance between each
    // of the cities that you traveled to. You can easily
    // find it with adjacent_difference()
    IntegerArray rgDifferences(7);
    IntegerArray::iterator itDifferences = rgDifferences.begin();
    adjacent_difference(rgIA.begin(),rgIA.end(),itDifferences);

    // Print the differences
    // Remember that the first item in the differences array is
    // not a difference, but is unused space
    cout << "The adjacent differences are: ";
    copy(rgDifferences.begin()+1,rgDifferences.end(),itOstream);
    cout << endl;

    // Suppose that you now want to know which adjacent differences
    // are greater. If you have [a,b,c], you would like [1,0] if a>b
    // and b<=c.
    // You are using less() rather than greater() because
    // adjacent_difference() reverses the parameters. For example,
    // if a and b are adjacent, adjacent_difference() calls
    // less(b,a). See the explanation at the top of this file
    // for a more exact description.
    IntegerArray rgGT(6);
    IntegerArray::iterator itGT = rgGT.begin();
    adjacent_difference(rgDifferences.begin()+1,
                        rgDifferences.end(),
                        itGT,
                        less<int>());

    // Print the greater thans
    // Remember that the first item in the differences array is
    // not a difference, but is unused space
    cout << "Which adjacent distances are greater:" << endl
         << "(If you have [a,b,c], then you have [1,0] if a>b and b<=c)"
         << endl;
    copy(rgGT.begin()+1,rgGT.end(),itOstream);
    cout << endl;
}
5661 7456 10995 17019 24394 30376 35758 
The adjacent differences are: 1795 3539 6024 7375 5982 5382 
Which adjacent distances are greater:
(If you have [a,b,c], then you have [1,0] if a>b and b<=c)
0 0 0 1 1 

Requirements

Header: <numeric>

See Also

Concepts

Standard Template Library Samples