目前vector和map是STL中最常用的两个容器,在使用vector或map时,根据需要会在容器中查找,然后删除,下面总结一下实际测试中正确的结果。
查找:
Map的查找可是使用find函数。
map< int, CString >::iterator iter;
iter = mapIntString.find( 1 );
if ( iter != mapIntString.end() )
{
//TODO:
}
而Vector中没有find函数,只能通过遍历来查找。
vector<int> vecNum;
for ( UINT i = 0; i < vecNum.size(); i++ )
{
//使用vecNum[i]来进行比较
}
删除:
Vector删除,如果不使用迭代器,可直接删除。
vector< int > m_vecNum;
m_vecNum.push_back( 1 );
m_vecNum.push_back( 2 );
m_vecNum.push_back( 3 );
for ( UINT i = 0; i < m_vecNum.size(); i++ )
{
if ( m_vecNum[i] == 1 )
{
m_vecNum.erase( &m_vecNum[i] );
break;
}
}
int num = m_vecNum[i];
结果num的值为2。
Map删除,map必须使用迭代器,删除的时候涉及到迭代器指针的问题。
例如:
map< int, CString > mapIntString;
CString strText;
strText.Format( "string1" );
mapIntString.insert( make_pair( 1, strText ) );
strText.Format( "string2" );
mapIntString.insert( make_pair( 2, strText ) );
strText.Format( "string3" );
mapIntString.insert( make_pair( 3, strText ) );
map< int, CString >::iterator iter;
iter = mapIntString.find( 1 );
if ( iter != mapIntString.end() )
{
mapIntString.erase( iter );
}
Int num = iter->first;
这种情况下,iter指的地址已经删除,所以最后num没有值。
正确的方法如下:
map< int, CString >::iterator iter;
map< int, CString >::iterator iterDel;
iter = mapIntString.find( 1 );
if ( iter != mapIntString.end() )
{
iterDel = iter;
iter++;
mapIntString.erase( iterDel );
}
Int num = iter->first;
此时的值正确,num为2。