标题: 请教STL编程中的一个multimap的erase问题,源码如下
pumacheng
LU新生
Rank: 1



UID 41694
精华 0
积分 2
帖子 3
活跃指数 2
LU金币 5 个
LU金条 0 个
阅读权限 10
注册 2006-3-2
 
发表于 2006-4-11 10:33  资料  个人空间  短消息  加为好友 
请教STL编程中的一个multimap的erase问题,源码如下

#include<iostream>
#include<string>
#include <hash_map.h>
using namespace std;

struct eqstr
{
        bool operator()(const char* s1, const char* s2) const
        {
                return strcmp(s1, s2) == 0;
        }
};

typedef hash_multimap<const char*, int, hash<const char*>, eqstr> map_type;

map_type M;

void lookup(const map_type& Map, const char* str)
{
        cout << str << ": ";
        pair<map_type::const_iterator, map_type::const_iterator> p =
                Map.equal_range(str);
        for (map_type::const_iterator i = p.first; i != p.second; ++i)
                cout << (*i).second << " ";
        cout << endl;
}

void GetPos(const map_type& Map, const char* str)
{
        pair<map_type::const_iterator, map_type::const_iterator> p =
                Map.equal_range(str);
        for (map_type::const_iterator i = p.first; i != p.second; ++i)
        {
                cout << "find:" << (*i).second << " " << endl;
               
                //添加这句后会编译不过去,我的目的是检索到后立刻erase掉此pos  
                M.erase(i);
        }
        cout << endl;

}


int main()
{
        M.insert(map_type::value_type("H", 1));
        M.insert(map_type::value_type("H", 2));
        M.insert(map_type::value_type("C", 12));
        M.insert(map_type::value_type("C", 13));
        M.insert(map_type::value_type("O", 16));
        M.insert(map_type::value_type("O", 17));
        M.insert(map_type::value_type("O", 18));
        M.insert(map_type::value_type("I", 127));

        lookup(M, "I");
        lookup(M, "O");
        lookup(M, "Rn");

        GetPos(M, "O");
}

顶部
jxppp
LU幼天使
Rank: 2


LU爱心使者  
UID 21356
精华 0
积分 154
帖子 297
活跃指数 3
LU金币 53 个
LU金条 5441 个
阅读权限 20
注册 2004-5-21
 
发表于 2006-4-12 17:07  资料  个人空间  短消息  加为好友 


  void erase(iterator __it) { _M_ht.erase(__it); }
  void erase(iterator __f, iterator __l) { _M_ht.erase(__f, __l); }

iterator is NOT const_iterator.

Try:
    erase(key) or change to iterator.

顶部
pumacheng
LU新生
Rank: 1



UID 41694
精华 0
积分 2
帖子 3
活跃指数 2
LU金币 5 个
LU金条 0 个
阅读权限 10
注册 2006-3-2
 
发表于 2006-4-13 17:31  资料  个人空间  短消息  加为好友 


QUOTE:
原帖由 jxppp 于 2006-4-12 17:07 发表

  void erase(iterator __it) { _M_ht.erase(__it); }
  void erase(iterator __f, iterator __l) { _M_ht.erase(__f, __l); }

iterator is NOT const_iterator.

Try:
...

thinks.
楼上朋友说的有道理,这是一个原因,另外一个原因是multimap每次erase后要重新遍历,否则出错,这是从侯J的书中看到的。

顶部
 



当前时区 GMT+8, 现在时间是 2008-12-5 10:41
乐悠LoveUnix论坛-京ICP备05005823号

Thanks to Discuz!  © 2001-2007    Power by LoveUnix.net
Processed in 0.058403 second(s), 6 queries , Gzip enabled

清除 Cookies - 联系我们 - 乐悠LoveUnix - Archiver