C++/Vector/vector

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

Add class to a vector and then delete them one by one

   
 
#include <iostream>
#include <vector>
using namespace std;
class MyClass {
};
int main( ) {
   vector<MyClass*> vec;
   MyClass* p = NULL;
   for (int i = 0; i < 10; i++) {
      p = new MyClass( );
      vec.push_back(p);
   }
   for (vector<MyClass*>::iterator pObj = vec.begin( );
        pObj != vec.end( ); ++pObj) {
      delete *pObj;
   }
   vec.clear( );
}


Assign Items in int array to vector

   
 
#include <iostream>
#include <vector>
#include <cassert>
#include <numeric>  // for accumulate
using namespace std;
int main()
{
  int x[5] = {2, 3, 5, 7, 11};
  vector<int> vector1(&x[0], &x[5]);
  int sum = accumulate(vector1.begin(), vector1.end(), 0);
  cout << sum << endl;
  return 0;
}
/* 
28
 */


Assign value to the last Item

   
 
/* The following code example is taken from the book
 * "The C++ Standard Library - A Tutorial and Reference"
 * by Nicolai M. Josuttis, Addison-Wesley, 1999
 *
 * (C) Copyright Nicolai M. Josuttis 1999.
 * Permission to copy, use, modify, sell and distribute this software
 * is granted provided this copyright notice appears in all copies.
 * This software is provided "as is" without express or implied
 * warranty, and with no claim as to its suitability for any purpose.
 */
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <iterator>
using namespace std;
int main()
{
    // create empty vector for strings
    vector<string> sentence;
    // reserve memory for five Items to avoid reallocation
    sentence.reserve(5);
    // append some Items
    sentence.push_back("Hello,");
    sentence.push_back("how");
    sentence.push_back("are");
    sentence.push_back("you");
    sentence.push_back("?");
    // assign "!" to the last Item
    sentence.back() = "!";
    // print Items separated with spaces
    copy (sentence.begin(), sentence.end(),
          ostream_iterator<string>(cout," "));
    cout << endl;
}
/* 
Hello, how are you !
 */


Computing an inner product of tuples represented as vectors

   
 
#include <vector>
#include <iostream>
using namespace std;
int main()
{
  const long N = 600000; // Length of tuples x and y
  const long S = 10;     // Sparseness factor
  vector<double> x(N), y(N);

  for (long k = 0; 3 * k * S < N; ++k)
    x[3 * k * S] = 1.0;
  for (long k = 0; 5 * k * S < N; ++k)
    y[5 * k * S] = 1.0;
  double sum = 0.0;
  for (long k = 0; k < N; ++k)
    sum += x[k] * y[k];
  cout << sum << endl;
  return 0;
}
/* 
4000
 */


Demonstrating STL vector constructors with a user-defined type

   
 
#include <iostream>
#include <cassert>
#include <vector>
using namespace std;
class MyClass {
public:
  unsigned long id;
  MyClass() : id(0) { }
  MyClass(unsigned long x) : id(x) { }

};
bool operator==(const MyClass& x, const MyClass& y) {
  return x.id == y.id;
}
bool operator!=(const MyClass& x, const MyClass& y)
{
  return x.id != y.id;
}

int main()
{
  vector<MyClass> vector1, vector2(3);
  assert (vector1.size() == 0);
  assert (vector2.size() == 3);
  assert (vector2[0] == MyClass() && vector2[1] == MyClass() &&vector2[2] == MyClass());
  assert (vector2 == vector<MyClass>(3, MyClass()));
  return 0;
}


Demonstrating STL vector constructors with a user-defined type and showing copying explicitly

   
 
#include <iostream>
#include <cassert>
#include <vector>
using namespace std;
class MyClass {
public:
  unsigned long id;
  unsigned long generation;
  static unsigned long total_copies;
  MyClass() : id(0), generation(0) { }
  MyClass(unsigned long n) : id(n), generation(0) { }
  MyClass(const MyClass& z) : id(z.id), generation(z.generation + 1) {
    ++total_copies;
  }
};
bool operator==(const MyClass& x, const MyClass& y)
{
  return x.id == y.id;
}
bool operator!=(const MyClass& x, const MyClass& y)
{
  return x.id != y.id;
}
unsigned long MyClass::total_copies = 0;
int main()
{
  vector<MyClass> vector1, vector2(3);
  assert (vector1.size() == 0);
  assert (vector2.size() == 3);
  assert (vector2[0] == MyClass() && vector2[1] == MyClass() &&
          vector2[2] == MyClass());
  for (int i = 0; i != 3; ++i)
    cout << "vector2[" << i << "].generation: " << vector2[i].generation << endl;
  cout << "Total copies: " << MyClass::total_copies << endl;
  return 0;
}
/* 
vector2[0].generation: 1
vector2[1].generation: 1
vector2[2].generation: 1
Total copies: 3
 */


Demonstrating STL vector copying constructors

   
 
#include <iostream>
#include <cassert>
#include <vector>
using namespace std;
int main()
{
  char name[] = "abcedfghijklmn";
  vector<char> myVector(name, name + 6);
  vector<char> myVector2(myVector); // Uses copy constructor
  assert (myVector2 == myVector);
  return 0;
}


Demonstrating the simplest STL vector constructors: duplicate chars

   
 
#include <iostream>
#include <cassert>
#include <vector>
using namespace std;
int main()
{
  vector<char> vector2(3, "x");
  assert (vector2.size() == 3);
  assert (vector2[0] == "x" && vector2[1] == "x" && vector2[2] == "x");
  assert (vector2 == vector<char>(3, "x"));
  return 0;
}


Demonstrating the simplest STL vector constructors: empty vector

   
 
#include <iostream>
#include <cassert>
#include <vector>
using namespace std;
int main()
{
  vector<char> vector1;
  cout << vector1.size();
  return 0;
}
/* 
0
 */


Pass vector of integer to a function

   
#include <iostream>
#include <numeric>
#include <vector>
#include <cmath>
#include <functional>
using namespace std;
double geometricMean(const vector<int>& nums)
{
  double mult = accumulate(nums.begin(), nums.end(), 1,multiplies<int>());
  return (pow(mult, 1.0 / nums.size()));
}

int main(int argc, char** argv)
{
  plus<int> myPlus;
  int res = myPlus(4, 5);
  cout << res << endl;
  vector<int> myVector;
  int num;
  while (true) {
    cout << "Enter a test score to add (0 to stop): ";
    cin >> num;
    if (num == 0) {
      break;
    }
    myVector.push_back(num);
  }
  cout << "The geometric mean is " << geometricMean(myVector) << endl;
  return (0);
}


Pass vector to a function

   
 
#include <iostream>
using std::cout;
using std::endl;
#include <vector>
using std::vector;
template < typename T > void printVector( const vector< T > &integers2 );
int main()
{
   int array[ 6 ] = { 1, 2, 3, 4, 5, 6 }; // initialize array
   vector< int > integers; // create vector of ints
   integers.push_back( 2 );
   integers.push_back( 3 );
   integers.push_back( 4 );
   printVector( integers );
   cout << endl;
   return 0;
}
template < typename T > void printVector( const vector< T > &integers2 ){
   typename vector< T >::const_iterator constIterator;
   for ( constIterator = integers2.begin();
      constIterator != integers2.end(); ++constIterator )
      cout << *constIterator << " ";
}
/* 
2 3 4
 */


Read keyboard input to a vector

   
 
/* The following code example is taken from the book
 * "The C++ Standard Library - A Tutorial and Reference"
 * by Nicolai M. Josuttis, Addison-Wesley, 1999
 *
 * (C) Copyright Nicolai M. Josuttis 1999.
 * Permission to copy, use, modify, sell and distribute this software
 * is granted provided this copyright notice appears in all copies.
 * This software is provided "as is" without express or implied
 * warranty, and with no claim as to its suitability for any purpose.
 */
#include <iostream>
#include <string>
#include <algorithm>
#include <iterator>
#include <vector>
using namespace std;
int main()
{
    /* create a string vector
     * - initialized by all words from standard input
     */
    vector<string> coll((istream_iterator<string>(cin)),
                        istream_iterator<string>());
    // sort Items
    sort (coll.begin(), coll.end());
    // print all Items ignoring subsequent duplicates
    unique_copy (coll.begin(), coll.end(),
                 ostream_iterator<string>(cout, "\n"));
}
/* 
Terminate batch job (Y/N)? n
 */


Requirements for Classes Used in Vectors

   
#include <iostream>
#include <vector>
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;
   }
}
class Item
{
   public:
   Item();
   ~Item();
   Item( const Item& );
   Item& operator=( const Item& );
   private:
   static int default_constructor_calls_;
   static int assignment_calls_;
   static int copy_constructor_calls_;
   static int destructor_calls_;
};
inline
Item::Item()
{ cout << "\nCall " << ++default_constructor_calls_
     << " of default constructor";
}
inline
Item::Item( const Item& )
{
   cout << "\nCall " << ++copy_constructor_calls_
      << " of copy constructor";
}
inline
Item::~Item()
{  cout << "\nCall " << ++destructor_calls_ << " of destructor"; }
inline
Item& Item::operator=( const Item& )
{
   cout << "\nCall " << ++assignment_calls_
      << " of assignment operator";
   return *this;
}
int Item::default_constructor_calls_ = 0;
int Item::assignment_calls_ = 0;
int Item::copy_constructor_calls_ = 0;
int Item::destructor_calls_ = 0;
int main( )
{
   vector<Item> d( 2 );
 
   d.resize( d.capacity() );
   d.push_back( Item() );
   d.erase( d.begin() );
}


Store a class object in a vector

   
 
#include <iostream>
#include <vector>
#include <cstdlib>
using namespace std;
class MyClass {
  int value;
public:
  MyClass() { value = 0; }
  MyClass(int x) { value = x; }
  MyClass &operator=(int x) {
    value = x; return *this;
  }
  double get_value() { return value; }
};
bool operator<(MyClass a, MyClass b)
{
  return a.get_value() < b.get_value();
}
bool operator==(MyClass a, MyClass b)
{
  return a.get_value() == b.get_value();
}
int main()
{
  vector<MyClass> v;
  for(int i=0; i<7; i++)
    v.push_back(MyClass(60 + rand()0));
  cout << "Farenheit valueeratures:\n";
  for(int i=0; i<v.size(); i++)
    cout << v[i].get_value() << " ";
  cout << endl;
  for(int i=0; i<v.size(); i++)
    v[i] = (int) (v[i].get_value()-32) * 5/9 ;
  cout << "Centigrade valueeratures:\n";
  for(int i=0; i<v.size(); i++)
    cout << v[i].get_value() << " ";
  return 0;
}
/* 
Farenheit valueeratures:
71 77 64 70 89 64 78
Centigrade valueeratures:
21 25 17 21 31 17 25 
 */


Use generic vector to create vector of chars

   
 

#include <iostream>
#include <cassert>
#include <vector>
#include <algorithm>  // For find
using namespace std;

int main()
{
  char x[5] = {"a", "b", "c", "d", "f"};
  vector<char> vector1(&x[0], &x[5]);
  // Search for the first occurrence
  vector<char>::iterator where = find(vector1.begin(), vector1.end(), "b");

  cout << *where  << endl;
  return 0;
}
/* 
b
 */


Use generic vector to create vector of integers

   
 
#include <iostream>
#include <cassert>
#include <vector>
#include <algorithm>  // For find
using namespace std;

int main()
{
  int x[5] = {2, 4, 6, 8, 10};
  vector<int> vector1(&x[0], &x[5]);
  // Search for the first occurrence
  vector<int>::iterator where = find(vector1.begin(), vector1.end(), 4);

  cout << *where  << endl;
  return 0;
}
/* 
4
 */


Use generic vector to create vector of strings

   
 
// Demonstrating the generic find algorithm with a vector
#include <iostream>
#include <cassert>
#include <vector>
#include <algorithm>  // For find
using namespace std;

int main()
{
  string x[5] = {"1234", "2345", "3456", "4567", "0987"};
  vector<string> vector1(&x[0], &x[5]);
  // Search for the first occurrence
  vector<string>::iterator where = find(vector1.begin(), vector1.end(), "1234");

  cout << *where  << endl;
  return 0;
}
/* 
1234
 */


Use typedef to define new type based on vector

  
#include <algorithm>
#include <vector>
#include <string>
#include <iostream>
using namespace std;
typedef vector <string> VECTOR_STRINGS;
int main ()
{
    VECTOR_STRINGS v;
    v.push_back ("A");
    v.push_back ("B");
    v.push_back ("C");
    v.push_back ("D");
    // insert a duplicate into the vector
    v.push_back ("D");
    for (size_t nItem = 0; nItem < v.size (); ++ nItem){
        cout << "Name [" << nItem << "] = \"";
        cout << v [nItem] << "\"" << endl;
    }
    return 0;
}