neat solution.
On Wed, 20 Feb 2008 13:36:45 -0800 (PST), rockdale
<rockdale.gr...@gmail.com> wrote:
Hi, all:
I am trying to migrate a VC++ 6.0 code into VS 2005. it is the code of
Typing Aid ComboBox comes from
http://www.codeguru.com/cpp/controls/combobox/article.php/c4951/.
Looks like std::vector does not support erase items like array
anymore.
m_vSections.erase(&m_vSections[i--]);
So I tried to change it using iterator, but the result does not acting
the same. Can somebody take a look on what I am doing wrong?
The vector::iterator type can be a class type, and it is in VC2005, while
&v[i] returns a pointer. Moreover, the vector::erase function is defined
only on iterators, not pointers. It worked in VC6 only because
vector::iterator was a pointer in the VC6 STL.
Also, if you guys have a better reference for a Typing Aid comboBox
(show muitiple Col in the drop down, when user type, looking for the
first match item in the dropdown. please guide me or show me the
hyperlinks.
Thanks in advance.
-rockdale
------------------------------------------------------
std::vector<CPoint> m_vSections;
void SectionSet::DeleteChars(UINT left, UINT right)
{
UINT width = right - left + 1;
for (int i = 0; i < m_vSections.size(); i++) {
// if the entire section is contained within
// the range (left, right) then delete the section
if (m_vSections[i].x >= left && m_vSections[i].y <= right){
//m_vSections.erase(&m_vSections[i--]); //non-support operation
//this is the start of my code to replace the above line
std::vector<CPoint>::iterator vecItr;
i--;
if(i<0) i=0;
Don't you think setting i to zero would be a problem when the outer loop is
resumed and i is incremented? The code you're trying to replace doesn't do
this.
for(vecItr=m_vSections.begin();
vecItr != m_vSections.end();
++vecItr)
{
if((m_vSections[i].y==vecItr->y)&&(
m_vSections[i].x==vecItr->x))
m_vSections.erase(vecItr);
break;
}
//this is the end of my code to replace the above line.
This is just all wrong, both in design and implementation. To start, you're
using the wrong value of i in the comparison. Get rid of all of it, take
advantage of the fact you've already found the element to erase and thus
needn't search for it all over again, and replace it with:
m_vSections.erase(m_vSections.begin()+i);
--i;
This is equivalent to (and stylistically better than, because it doesn't
gratuitously embed expressions with side-effects inside other expressions):
m_vSections.erase(&m_vSections[i--]); //non-support operation
In general, you can use std::advance to turn an index into an iterator, but
since vector's iterators are random access, you can use pointer-style
arithmetic here, which is easier.
--
Doug Harrison
Visual C++ MVP