446,412 Members | 929 Online Need help? Post your question and get tips & solutions from a community of 446,412 IT Pros & Developers. It's quick & easy.

# ways to delete the element in between with vector?

 P: n/a Hi, is there any ways that allow us to delete an element in between? say int_val: 1 int_val: 2 int_val: 3 we want to delete 2 from int_val so that it becomes int_val: 1 int_val: 3 I have heard of using iterator with erase() but it seemed a bit complicated for me thank you very much. jacky Nov 7 '06 #1
7 Replies

 P: n/a "JH Programmer"

 P: n/a Thank you so much! ########################### Here are for others to search for this thread ================================= If you want to delete a specific element in the vector "array" you use this method for (int i = 0; i < data.size(); i++){ if ( data[i] == data_buffer ){ pos = i; } } data.erase(data.begin() + pos ); ############################# "Daniel T. Ð´µÀ£º " "JH Programmer"

 P: n/a "JH Programmer" unsigned find( const vector& vec, T buffer ) { unsigned result = vec.size(); for ( unsigned i = 0; i < vec.size(); ++i ) if ( vec[i] == buffer ) result = i; return result; } The above will return the last element that has the value 'buffer' or vec.size() if no element has the value. Of course, going through the whole container is needless, once you find the element you want, you can stop looking... template < typename T > unsigned reverse_find( const vector& vec, T buffer ) { for ( unsigned i = vec.size(); i 0; --i ) if ( vec[i - 1] == buffer ) return i - 1; return vec.size(); } Notice that I'm going through the container backwards because I want to find the *last* element with the particular value. It just so happens that the standard already has a function like this, defined in vec.erase( find( vec.rbegin(), vec.rend(), buffer ).base() ); The above line will do the same thing your code segment does. -- To send me email, put "sheltie" in the subject. Nov 7 '06 #4

 P: n/a Thanks again Since I am implementing the deletion of username in the login system, because login name is unique, so it works fine. but one thing I can think of is that we can declare another vector array vector= 0; i--){ data.erase(data.begin() + pos[i]); } so delete from the back in vector "data" will give correct output. [0 1 0 3 4 1 0] "Daniel T. Ð´µÀ£º " "JH Programmer" unsigned find( const vector& vec, T buffer ) { unsigned result = vec.size(); for ( unsigned i = 0; i < vec.size(); ++i ) if ( vec[i] == buffer ) result = i; return result; } The above will return the last element that has the value 'buffer' or vec.size() if no element has the value. Of course, going through the whole container is needless, once you find the element you want, you can stop looking... template < typename T > unsigned reverse_find( const vector& vec, T buffer ) { for ( unsigned i = vec.size(); i 0; --i ) if ( vec[i - 1] == buffer ) return i - 1; return vec.size(); } Notice that I'm going through the container backwards because I want to find the *last* element with the particular value. It just so happens that the standard already has a function like this, defined in vec.erase( find( vec.rbegin(), vec.rend(), buffer ).base() ); The above line will do the same thing your code segment does. -- To send me email, put "sheltie" in the subject. Nov 7 '06 #5

 P: n/a "Daniel T." : : vec.erase( find( vec.rbegin(), vec.rend(), buffer ).base() ); : The above line will do the same thing your code segment does. No! Caveat: &*revIter != &*(revIter.base()) !! The reverse iterators had to bee shifted, because for example: rbegin().base() == end() but *rbegin() shall return the last element == *(end()-1) So a corrected statement would be: vec.erase( find( vec.rbegin(), vec.rend(), buffer ).base()-1 ); Tricky details... hth -Ivan -- http://ivan.vecerina.com/contact/?subject=NG_POST <- email contact form Brainbench MVP for C++

 P: n/a "JH Programmer" Since I am implementing the deletion of username in the login system, because login name is unique, so it works fine. In that case, I question the wisdom of using a vector. A std::set would support faster deletion and insure that there is only one of each name in existence. but one thing I can think of is that we can declare another vector array vector= 0; i--){ data.erase(data.begin() + pos[i]); } so delete from the back in vector "data" will give correct output. [0 1 0 3 4 1 0] The erase-remove idiom is more effecient in general for removing all values from a container. pos.erase( remove( pos.begin(), pos.end(), 2 ), pos.end() ); Writing the above out would look something like this: unsigned shift_amt = 0; unsigned i = 0; while ( i < pos.size() ) { pos[i - shift_amt] = pos[i]; if ( pos[i] == value_to_remove ) { ++shift_amt; ++i; } pos.resize( pos.size() - shift_amt ); This way, each cell is shifted only once, no matter how may of that value exist in the container. -- To send me email, put "sheltie" in the subject. Nov 7 '06 #7

 P: n/a In article <7a***************************@news.hispeed.ch>, "Ivan Vecerina" <_I*******************@ivan.vecerina.comwrote: "Daniel T." : : vec.erase( find( vec.rbegin(), vec.rend(), buffer ).base() ); : The above line will do the same thing your code segment does. No! Caveat: &*revIter != &*(revIter.base()) !! The reverse iterators had to bee shifted, because for example: rbegin().base() == end() but *rbegin() shall return the last element == *(end()-1) So a corrected statement would be: vec.erase( find( vec.rbegin(), vec.rend(), buffer ).base()-1 ); Tricky details... Good catch, I forgot about that (don't use reverse iterators much.) -- To send me email, put "sheltie" in the subject. Nov 7 '06 #8

### This discussion thread is closed

Replies have been disabled for this discussion. 