我在应用中的例子如下:
map<QString, bool> m_allSkakFilepath;
auto itpath = m_allSkakFilepath.find(skaPaths.at(n).c_str());
if (itpath !=m_allSkakFilepath.end())
{
m_allSkakFilepath[skaPaths.at(n).c_str()] = false;
}
else
{
m_allSkakFilepath[skaPaths.at(n).c_str()] = true;
}
此map主要应用场合:
一般是有很多文件。并需要查找文件是否有效,要不被用过,如果用过则标志位做为true,也可用在很多组件是否被使用过,总之不管在什么场合,就是为了查找方便
以上那段代码是添加删除,map的好处是,主要上面的key值没有在map中,直接给值就会增加一个key值
下面再给出一段遍历删除的代码,以下代码为删除map中值为true,结合上面那段的意义就是用过的值全部清除记得清清后iter++:
map<QString, bool>::iterator iter=m_allSkakFilepath.begin();
for(;iter!=m_allSkakFilepath.end();){
if((*iter).second==true){
m_allSkakFilepath.erase(iter++);
}
else{
++iter;
}
}
map的清除操作:
//清除方式1:直接将map删除了
m_allSkakFilepath.clear();
//map.clear()只是把map清空了,但是内存没有释放,如果要释放内存不止是要clear()掉,还要和一个空的map来进行swap,将内存释放
//注意map中如果元素不是基本类型,也要进行内存释放,如指针,vector要尤其注意,否则map占的内存太大,会造成程序崩溃
//清除方式2用map.erase(map.begin(),map.end())比较好 清空元素
m_allSkakFilepath.erase(m_allSkakFilepath.begin(),m_allSkakFilepath.end());
//清除方式3
map<QString, bool> empty_map1;
m_allSkakFilepath.swap(empty_map1);
输出map大小
输出map大小
int nsize=m_allSkakFilepath.size();
map的排序说明:map本身默认按照key值升序排序,个人觉得够用了
如果你想倒序遍历可参考如下(用reverse_iterator指针):
for( map<QString, bool>::reverse_iterator rit=m_allSkakFilepath.rbegin();rit!=m_allSkakFilepath.rend();rit++)
cout<<(*rit).first<<","<<(*rit).second<<endl;
修改map中的值,修改比较简单,只要在其中的key设成相应的值便可以了,如下:直接设置key3从false变成true
map<QString, bool> m_allSkakFilepath;
m_allSkakFilepath.insert(("key1", false));
m_allSkakFilepath.insert(("key2", false));
m_allSkakFilepath.insert(("key3", false));
m_allSkakFilepath.insert(("key4", true));
{
map<QString, bool>::const_iterator iteMap = m_allSkakFilepath.begin();
cout << "==============旧值结果输出=============" << endl;
for(; iteMap != m_allSkakFilepath.end(); ++ iteMap)
{
cout << m_allSkakFilepath->first;
cout << ":";
cout << m_allSkakFilepath->second << endl;
}
}
//修改
m_allSkakFilepath.insert(("key3", true));
{
map<QString, bool>::const_iterator iteMap = m_allSkakFilepath.begin();
cout << "==============新值结果输出=============" << endl;
for(; iteMap != m_allSkakFilepath.end(); ++ iteMap)
{
cout << m_allSkakFilepath->first;
cout << ":";
cout << m_allSkakFilepath->second << endl;
}
}