120 likes | 131 Views
Vectors. the better arrays. Why Vectors. vectors are implemented as a class (a template to be exact) they serve the same purpose as arrays but using object oriented mechanisms (such as operator overloading) making them more powerful vectors can grow and shrink as needed
E N D
Vectors the better arrays
Why Vectors • vectors are implemented as a class (a template to be exact) • they serve the same purpose as arrays but using object oriented mechanisms (such as operator overloading) making them more powerful • vectors can • grow and shrink as needed • be compared and assigned as a whole • be passed by reference/value/returned • vector size is always available • still more … • part of the so called Standard Template Library (STL) • once you have learned vectors, you do not want to use (raw) arrays anymore.
Declaration • include <vector> header file • using std::vector; • to declare vector<type_parameter> vectorName; where type_parameter – type/class of vector elements • corresponds to base type of the array examples vector<int> items; // declares vector with no elements vector<double> nums(5); // declares vector with 5 elements vector<myclass> things(5); // declares a vector of 5 objects of myclass
Typical Array Operations • indexing: items[3] • still cannot refer past vector size: items[6]++; // range error • checking size: items.size() • careful with this one: returns value of type size_t • example: for(size_t i=0; i < items.size(); ++i) cout << items[i];
Atypical Array Operations • adding element: items.push_back(55); • removing element: items.pop_back(); • checking if empty: items.empty(); • accessing first/last element: items.front(); items.back(); • changing size: items.resize(newSize); • emptying: items.erase(); • example: int num=0; cin >> num; while(num !=0){ items.push_back(num); cin >> num; } while(!items.empty()){ cout << items.back(); items.pop_back(); }
With Functions, Other Aggregate Operations • can pass by value/reference, return void myfunc(vector<int>); void myfunc(vector<int>&); vector<int> myfunc(void); • can assign vector<int> v; v = items; • can swap: items.swap(v); • can compare: if(v == items) …
With Objects class intData{ // elementary class definition public: void set(int n){data=n;}; // simple setter int get(void) const{return data;}; // simple accessor private: int data; }; … vector<intData> v(5); // declaring a vector of objects for(int i=0; i<5; i++){ // using vector as array int num; cin >> num; v[i].set(num); // invoking a method on vector element }
Iterators • iteratoris a generalization of pointer • not a pointer but usually implemented using pointers • further enhances the power of vector • declaring iterator vector<type_parameter>::iterator iteratorName; where type_parameter – type/class of elements • example vector<int>::iterator p;
Iterators Operations • operations • ++ (pre- and postfix) and -- to advance to the next (previous) data item • +5 -3 advance certain number of positions forward/backward • == and != operators to test whether two iterators point to the same data item • < > to compare if two elements are before and after in the vector • dereferencing (*) provides data item access • functions • v.begin() returns an iterator pointing to the first element of container v • v.end() returns an iterator pointing pastthe last element of container v useful to compare for end of iteration • inserting: v.insert(ip, 22); // inserts one element at // iterator ip position what does this do? v.insert(v.end()-2, 55); • erasing: v.erase(ip); // erases (deletes) one element at // iterator ip position • sorting elements: sort(items.begin(),items.end()); • need algorithm header • caution: after altering a vector (inserting/erasing/sorting), iterators are invalidated and cannot be used unless given a value again (reassigned).
Iterator Usage Example vector <int> v; // declare vector … for ( // declare and initialize iterator vector<int>::iterator p = v.begin(); p < v.end(); // check if end is not reached ++p // move iterator to next element ){ cout << *p; // manipulate element in loop body }
Typedef • variable declarations can get long and obscure program meaning • typedef – allows to give names to already defined types and classes • note: no new types declared • benefits: shortens the code, gives more intuitive names, adds portability – can change defined type later if needed • syntax: typedef existingType newType; • example typedef vector<int> myVector; typedef myvector::iterator myVectorIterator; myVector v; for (myVectorIterator p=v.begin(); p < v.end(); p++){ cout << *p; • do not overdo – typedefs hide original types: give new types intuitive names, do not use for short/understandable types
Questions on Vectors • why use vectors instead of arrays? what header file is needed to use vectors? • how is vector declared? how to declare a vector of five integers? • how can one determine the size of a vector? What is the size of this vector vector<int> myvector(4); • how does one add/remove elements from a vector? • how does one get the first/last element from a vector? • can vectors be assigned to each other? What happens to their size? contents? compared with each other? when are they equal? • can vectors be passed by value? reference? returned? • can vectors contain objects? • what is an iterator? how is it used? • what is typedef? How is it used? What are begin() and end()?