A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 微笑=.一瞬间 山林野马   /  2014-4-20 13:30  /  1262 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Map 集合和list 集合和Set集合到底哪里不同呢?

4 个回复

倒序浏览
一、map的说明  
  1   头文件
  #include   <map>
  
  2   定义
  map<string,   int>   my_Map;
  或者是typedef     map<string,   int>   MY_MAP;
  MY_MAP   my_Map;
  
  3   插入数据
  (1)   my_Map["a"]   =   1;
  (2)   my_Map.insert(map<string,   int>::value_type("b",2));
  (3)   my_Map.insert(pair<string,int>("c",3));
  (4)   my_Map.insert(make_pair("d",4));
  
  4   查找数据和修改数据
  (1)   int   i   =   my_Map["a"];
            my_Map["a"]   =   i;
  (2)   MY_MAP::iterator   my_Itr;
            my_Itr.find("b");
            int   j   =   my_Itr->second;
            my_Itr->second   =   j;
  不过注意,键本身是不能被修改的,除非删除。
  
  5   删除数据
  (1)   my_Map.erase(my_Itr);
  (2)   my_Map.erase("c");
  还是注意,第一种情况在迭代期间是不能被删除的,道理和foreach时不能删除元素一样。
  
  6   迭代数据
  for   (my_Itr=my_Map.begin();   my_Itr!=my_Map.end();   ++my_Itr)   {}
  
  7   其它方法
  my_Map.size()               返回元素数目
  my_Map.empty()       判断是否为空
  my_Map.clear()           清空所有元素
  可以直接进行赋值和比较:=,   >,   >=,   <,   <=,   !=   等等
  
  更高级的应用查帮助去吧,^_^;

二\map的举例

要求: 将mymap中itemstruct   的a大于100的项删除  
struct   itemstruct
  {
            int   a;
            char   b[20];
  };
  map<string,   itemstruct   >     mymap.
  
解答1:
  #include   <iostream>
  #include   <ctime>
  #include   <map>
  using   namespace   std;
  typedef   struct   itemstruct
  {
            int   a;
            char   b[20];
  }itemS;
  itemS   s[4]   =   {{102,"what"},
                          {33,   "hello"},
                          {198,"world"},
                          {45,   "c++"}
                      };;
  
  
  int     main()
  {
            map<string,   itemS>     mymap;
            string   str[4]   =   {"1st","2nd","3rd","4th"};
            for(int   i   =   0;   i<4;   i++)
            {
                 mymap.insert(make_pair(str[i],   s[i]));
            }
            
            map<string,itemS>::iterator   it;
            for(it=mymap.begin();   it!=mymap.end(); it++)
            {
               if(it->second.a >100){
                  i=mymap.erase(it);  ----->正确
    mymap.erase(it);     ----->it失效..
        }
            }
  //first是Key, second是value;
            for(it = mymap.begin();  it!=mymap.end(); it++)
            {
                          cout<<it->first<<"   "<<it->second.a<<"   "<<it->second.b<<endl;
            }
          system("pause");
          return   0;
  }

解答2:
#include<map>
  #include<iterator>
  #include<string>
  #include<iostream>
  #include<cstring>
  using   namespace   std;
  struct   itemstruct
  {
            int   a;
            char   b[20];
            itemstruct(int   t,char*str)
    {
    a=t;
    strcpy(b,str);
    }
  };
  int   main()
  {
  map<string,itemstruct>mymap;
  mymap.insert(make_pair("a",itemstruct(10,"hanzhou")));
  mymap.insert(make_pair("ab",itemstruct(20,"fuzhou")));
  mymap.insert(make_pair("abc",itemstruct(30,"zhengzhou")));
  mymap.insert(make_pair("abcd",itemstruct(200,"wuhan")));
  mymap.insert(make_pair("abcde",itemstruct(150,"kunming")));
  mymap.insert(make_pair("abcdef",itemstruct(50,"xiamen")));
  map<string,itemstruct>::iterator   it=mymap.begin();
  while(it!=mymap.end())
  {
  if((it->second).a>100)mymap.erase(it++);
  else   it++;
  }
  it=mymap.begin();
  while(it!=mymap.end())
  {
  cout<<it->first<<"   "<<(it->second).a<<"   "<<(it->second).b<<endl;
  it++;
  }
  system("PAUSE");
  return   0;
  }

解答3:
  for(map<string,   itemstruct>::iterator   i   =   mymap.begin();   i   !=   mymap.end();)
  {
          if(i->second.a   >   100)
                  i   =   mymap.erase(i);
          else
                  ++i;
  }

解答4: VC6中编译map编译出错的解决方法
Warnings similar to the following are generated even if you use the warning pragma to disable the warning: warning C4786: 'std::rb_tree<CAiSpanningTree<State,std::less<State>>::TransClosureNode, CAiSpanningTree<State,std::less<State>>::TransClosureNode,std::ident<Cai SpanningTree<State,std::less<State>>::TransClosureNode,CAiSpanningTree<S tate,std::less<State>>::TransClosureNode>,std::less<CAiSpanningTree<Stat e,std::less<State>>::TransClosureNode>>' : identifier was truncated to '255' characters in the debug information


解决code 加在stdafx.h的头文件处:

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 luoyang316 于 2014-4-20 14:27 编辑

Set对每个对象只接受一次,并使用自己内部的排序方法(通常,你只关心某个元素是否属于Set,而不关心它的顺序--否则应该使用List)。Map同样对每个元素保存一份,但这是基于"键"的,Map也有内置的排序,因而不关心元素添加的顺序。如果添加元素的顺序对你很重要,应该使用 LinkedHashSet或者LinkedHashMap.
List有顺序有重复没有排序,set无重复有排序,map的key也和set一样。
如果想跟List一样需要有插入元素的顺序,请使用LinkedHashSet或者LinkedHashMap。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 悠然丶 于 2014-4-20 14:51 编辑

       1,>List和Set的异同点
                 * 相同点:1.两者都是继承于Collection接口。
                 *      2.两者都是存储对象元素的集合。
                 *      3.两者都可以使用迭代器的方法进行集合遍历。
                 * 不同点:
                 * 1.List集合体系中的元素排序是有序的。 Set集合体系中的元素是无序的。
                 * 2.List集合中的元素是可以重复的。 Set集合中的元素是不可以重复的。
                 * 3.List集合的子类是ArrayList、LinkedList、Vector 三个子类。
                 *   Set集合的子类是HashSet、TreeSet两个子类。
                 * 4.两者对数据存储的方式不同。
                 *
          2.>Map集合的特点和常用类特点
                 * Map集合下有HashMap、HashTable、TreeMap三个子接口。
                 * HashTable:底层数据结构是哈希表,不可以存入空健和空值。线程同步。
                 * HashMap底层的数据结构也是哈希表。可以存入空健空值。线程非同步。
                 * TreeMap底层的数据结构是二叉树。线程非同步,也可以用于给Map集合中的健进行排序。
                 

评分

参与人数 1技术分 +1 收起 理由
Silent_memory + 1 很给力!

查看全部评分

回复 使用道具 举报
补充下楼上的:
List集合的子类是ArrayList、LinkedList、Vector 三个子类
        List集合的contains()方法调用的是元素的equals()方法
  • ArrayList底层使用数组数据结构,查询快,增删稍慢,线程不同步
  • LinkedList底层使用链表数据结构,查询稍慢,增删快,线程不同步
  • Vector底层使用数组数据结构,但是线程同步,用的不多
Set集合的子类有HashSet和TreeSet
  • HashSet底层使用Hash数据结构,线程不同步,比较、排序时都会调用hashCode()和equals()方法
  • TreeSet底层使用二叉树数据结构,线程不同步,比较、排序时则会以Comparab接口中的compareTo()方法为依据

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马