C++ Tutorial/vector/Algorithm

Материал из C\C++ эксперт
Перейти к: навигация, поиск

Fill elements in a vector with custom generator

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int Fibonacci(void){
  static int r;
  static int f1 = 0;
  static int f2 = 1;
  r = f1 + f2;
  f1 = f2;
  f2 = r;
  return f1;
}
int main(void){
  const int VECTOR_SIZE = 15;
  typedef vector<int> IntVector;
  typedef IntVector::iterator IntVectorIt;
  IntVector Numbers(VECTOR_SIZE);
  IntVectorIt start, end , it;
  int i;
  for(i = 0; i < VECTOR_SIZE; i++)
    Numbers[i] = i * i;
  start = Numbers.begin();
  end = Numbers.end();
  for (it = start; it != end; it++)
    cout << *it << " ";
  generate_n(start + 5, Numbers.size() - 5, Fibonacci);
  for (it = start; it != end; it++)
  cout << *it << " ";
}

find_if, bind2nd and greater_equal

#include <algorithm>
#include <vector>
#include <iostream>
#include <functional>
using namespace std;
int main(int argc, char** argv)
{
  int num;
  vector<int> myVector;
  while (true) {
    cout << "Enter a test score to add (0 to stop): ";
    cin >> num;
    if (num == 0) {
      break;
    }
    myVector.push_back(num);
  }
  vector<int>::iterator it = find_if(myVector.begin(), myVector.end(),bind2nd(greater_equal<int>(), 100));
  if (it == myVector.end()) {
    cout << "No perfect scores\n";
  } else {
    cout << "Found a \"perfect\" score of " << *it << endl;
  }
  return (0);
}

Find the first element in the range (first, last + 1) that matches value

#include <iostream>
#include <algorithm>
using namespace std ;
int main(void)
 {
   const int ARRAY_SIZE = 8;
   int IntArray[ARRAY_SIZE] = { 1, 2, 3, 4, 4, 5, 6, 7 };
   int *location ;  //stores the position of the first matching element.
   int i;
   int value = 4;
   // print content of IntArray
   for (i = 0; i < ARRAY_SIZE; i++)
     cout << IntArray[i] << ", ";
   //Find the first element in the range (first, last + 1) that matches value.
   location = find(IntArray, IntArray + ARRAY_SIZE, value);
   
   //print the matching element if any was found
   if (location != IntArray + ARRAY_SIZE)  
     cout << "First element that matches " << value << " is at location "
     << (location - IntArray) << endl;
   else                    
     cout << "The sequence does not contain any elements with value " << value << endl;
}

for_each element in a vector apply custom function

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void PrintCube(int n)
{
    cout << "The cube of " << n << " is " << n * n * n << endl;
}
int main(void)
{
    const int VECTOR_SIZE = 8 ;
    typedef vector<int > IntVector ;    
    typedef IntVector::iterator IntVectorIt;
    IntVector Numbers(VECTOR_SIZE) ;    
    IntVectorIt start, end, it ;      
    int i ;
    for (i = 0; i < VECTOR_SIZE; i++)
        Numbers[i] = i + 1 ;
    start = Numbers.begin() ;   
    end = Numbers.end() ;       
    for(it = start; it != end; it++)
        cout << *it << " " ;
    for_each(start, end, PrintCube);
}

Inner product of a vector and another vector

#include <vector> 
#include <iostream> 
#include <numeric>   
using namespace std; 
template <class T>
void print(T& c){
   for( typename T::iterator i = c.begin(); i != c.end(); i++ ){
      std::cout << *i << endl;
   }
}
int main() { 
  vector<double> vec1(4, 2.0);  // Length 4, all values == 2.0 
  vector<double> vec2(4, 4.0);  // Length 4, all values == 4.0 
  double init = 0.0; 
  double summation = accumulate (vec1.begin(), vec1.end(), init); 
  cout << "Sum of elements in vector 1: " << summation << endl; 
  double ip = inner_product(vec1.begin(), vec1.end(), vec2.begin(), init); 
  cout << "Inner product of vec1 and vec2: " << ip << endl; 
  int size = 6; 
  int seed_value = 2; 
  vector<int> vec3(size, seed_value); 
  vector<int> result(size); 
  partial_sum(vec3.begin(), vec3.end(), result.begin()); 
  print(result); 
  int sz = 10; 
  int value = 2; 
  vector<int> vec4(sz); 
  vector<int>::iterator it; 
  for (it = vec4.begin(); it != vec4.end(); it++) 
  { 
    (*it) = value; 
    value += 1; 
  } 
  vector<int> result2(vec4.size()); 
  adjacent_difference(vec4.begin(), vec4.end(), result2.begin()); 
  cout << "The adjacent difference of the vector vec4\n"; 
  print(result2); 
  return 0; 
}

merge the elements of NumbersVestor and NumbersList and place the results in NumbersDeque

#include <iostream>
#include <vector>
#include <algorithm>
#include <list>
#include <deque>
using namespace std;
int main(void)
{
  const int MAX_ELEMENTS = 8;
  typedef vector<int> IntVector;    
  typedef IntVector::iterator IntVectorIt;
  typedef list<int> IntList;      
  typedef IntList::iterator IntListIt;
  typedef deque<int> IntDeque;    
  typedef IntDeque::iterator IntDequeIt;
  IntVector NumbersVector(MAX_ELEMENTS);
  IntVectorIt startv, endv, itv;
  IntList NumbersList;
  IntListIt first, last, itl;
  IntDeque NumbersDeque(2 * MAX_ELEMENTS);
  IntDequeIt itd;
  NumbersVector[0] = 4;
  NumbersVector[1] = 10;
  NumbersVector[2] = 70;
  NumbersVector[3] = 10;
  NumbersVector[4] = 30;
  NumbersVector[5] = 69;
  NumbersVector[6] = 96;
  NumbersVector[7] = 100;
  first = NumbersList.begin();  
  last = NumbersList.end();    
  //place the results in NumbersDeque
  merge(startv, endv, first, last, NumbersDeque.begin());
  for (itd = NumbersDeque.begin(); itd != NumbersDeque.end(); itd++)
    cout << *itd << " ";
}

Mutating Sequence Algorithm

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
template<class T>
class Print
{
public:
     void operator()(const T& t)
     {
         cout << t << " ";
     }
};
 
int main()
{
     Print<int>    DoPrint;
     vector<int>    vInt(10);
 
     fill(vInt.begin(), vInt.begin() + 5, 1);
     fill(vInt.begin() + 5, vInt.end(), 2);
 
     for_each(vInt.begin(), vInt.end(), DoPrint);
 
     return 0;
}

random number generation in quantitative finance

#include <vector> 
#include <iostream> 
#include <algorithm> 
#include <time.h> 
using namespace std; 
void print(const vector<int>& v) 
{ 
  vector<int>::const_iterator i; 
  cout << "["; 
  for (i=v.begin(); i!=v.end(); i++) cout << *i << ", "; 
  cout << "]" << endl; 
} 
int main() 
{ 
  srand((unsigned) time (NULL)); 
  int Size = 5; 
  vector<int> v1, v2; 
  int i; 
  for (i=0; i<= Size; i++) 
    v1.push_back(rand()); 
  for (i=0; i< Size; i++) 
    v2.push_back(rand()); 
  cout << "Two random lists" << endl; 
  print(v1); 
  print(v2); 
  sort(v1.begin(), v1.end()); 
  sort(v2.begin(), v2.end()); 
  cout << "Two sorted lists" << endl; 
  print(v1); 
  print(v2); 
  // Merge the two lists to a third list 
  vector<int> v3(v1.size()+v2.size()); 
  cout << endl << "Merge the two lists" << endl; 
  merge(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin()); 
  print(v3); 
  return 0; 
}

shuffle the elements in a random order

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(void)
{
    const int VECTOR_SIZE = 8 ;
    typedef vector<int> IntVector ;
    typedef IntVector::iterator IntVectorIt ;
    IntVector Numbers(VECTOR_SIZE) ;
    IntVectorIt start, end, it ;
    Numbers[0] = 4 ;
    Numbers[1] = 10;
    Numbers[2] = 70 ;
    Numbers[3] = 30 ;
    Numbers[4] = 10;
    Numbers[5] = 69 ;
    Numbers[6] = 96 ;
    Numbers[7] = 100;
    start = Numbers.begin() ;   
    end = Numbers.end() ;       
    for(it = start; it != end; it++)
        cout << *it << " " ;
    random_shuffle(start, end) ;
    for(it = start; it != end; it++)
        cout << *it << " " ;
}

The adjacent difference of the vector

#include <vector> 
#include <iostream> 
#include <numeric>   
using namespace std; 
template <class T>
void print(T& c){
   for( typename T::iterator i = c.begin(); i != c.end(); i++ ){
      std::cout << *i << endl;
   }
}
int main() { 
  vector<double> vec1(4, 2.0);  // Length 4, all values == 2.0 
  vector<double> vec2(4, 4.0);  // Length 4, all values == 4.0 
  double init = 0.0; 
  double summation = accumulate (vec1.begin(), vec1.end(), init); 
  cout << "Sum of elements in vector 1: " << summation << endl; 
  double ip = inner_product(vec1.begin(), vec1.end(), vec2.begin(), init); 
  cout << "Inner product of vec1 and vec2: " << ip << endl; 
  int size = 6; 
  int seed_value = 2; 
  vector<int> vec3(size, seed_value); 
  vector<int> result(size); 
  partial_sum(vec3.begin(), vec3.end(), result.begin()); 
  print(result); 
  int sz = 10; 
  int value = 2; 
  vector<int> vec4(sz); 
  vector<int>::iterator it; 
  for (it = vec4.begin(); it != vec4.end(); it++) 
  { 
    (*it) = value; 
    value += 1; 
  } 
  vector<int> result2(vec4.size()); 
  adjacent_difference(vec4.begin(), vec4.end(), result2.begin()); 
  cout << "The adjacent difference of the vector vec4\n"; 
  print(result2); 
  return 0; 
}

Use count to determine the number of "0"s in the vector

#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
template <typename elementType>
bool IsEven (const elementType& number)
{
    return ((number % 2) == 0);
}
int main ()
{
    vector <int> v;
    for (int nNum = -9; nNum < 10; ++ nNum)
        v.push_back (nNum);
    vector <int>::const_iterator i;
    for ( i = v.begin (); i != v.end (); ++ i )
        cout << *i << " ";
    cout << v.size () << "" elements" << endl;
    // Use count to determine the number of "0"s in the vector
    size_t nNumZeroes = count (v.begin (),v.end (),0);
    cout << "Number of instances of "0": " << nNumZeroes << endl << endl;
    cout << "Searching for an element of value 3 using find: " << endl;
    return 0;
}

Use the count_if algorithm with the unary predicate IsEven

#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
template <typename elementType>
bool IsEven (const elementType& number)
{
    return ((number % 2) == 0);
}
int main ()
{
    vector <int> v;
    for (int nNum = -9; nNum < 10; ++ nNum)
        v.push_back (nNum);
    vector <int>::const_iterator i;
    for ( i = v.begin (); i != v.end (); ++ i )
        cout << *i << " ";
    cout << v.size () << "" elements" << endl;
    // Use the count_if algorithm with the unary predicate IsEven:
    size_t nNumEvenElements = count_if (v.begin (),v.end (), IsEven <int> );
    cout << "Number of even elements: " << nNumEvenElements << endl;
    cout << "Number of odd elements: ";
    cout << v.size () - nNumEvenElements << endl;
    return 0;
}

Using the for_each() Algorithm

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
template<class T>
class Print
{
public:
    void operator()(const T& t)
    {
        cout << t << " ";
    }
};
int main()
{
    Print<int>    DoPrint;
    vector<int>    vInt(5);
    for (int i = 0; i < 5; ++i)
        vInt[i] = i * 3;
    cout << "for_each()\n";
    for_each(vInt.begin(), vInt.end(), DoPrint);
    cout << "\n";
    return 0;
}