Vectors
E N D
Presentation Transcript
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()?