map相关操作

           由于工作中经常用到map来进行数据保存和数据遍历,这里来总结一下,先看看C++ Primer这么描述的。map属于关联容器,定义了一个关联数组,类似vector,map是一个类模板。但是一个map要用两个类型来定义:关键字的类型和关键值的类型。在一个map中,一个给定关键字只能出现一次,每个关键字关联一个特定的值。解引用一个map迭代器会生成一个pair,它保存一个const关键字及其关联的值。话不多说,看代码,为了简洁,我省略了头文件。

1.map的遍历

 

int main()
{
      map<string,int> word={{"a",1},{"b",2}};
      map<string,int>::iterator IT;

      for(IT=word.begin();IT!=word.end();IT++)
      {
           cout<<IT->first<<','<<IT->second<<endl;
      }

      return 0;
}

打印:a,1

 

            b,2

2.map的插入操作(insert)。insert函数操作的返回值是一个pair,其first成员是一个迭代器,指向具有给定关键字的元素,second的成员是一个bool值

 

int main()
{
      map<string,int> word;
      pair<map<string,int>::iterator,bool> ret;//定义insert的返回值
      ret=word.insert(pair<string,int>("a",1));
      if(ret.second)
      {
            cout<<"yes"<<endl;
            cout<<ret.first->second<<endl;
      }

      return 0;
}

打印:yes

 

            1

3.map的删除操作(erase)

 

int main()
{
      map<string,int>word={{"a",1},{"b",2},{"c",3}};
      int num=word.erase("a")//利用关键字删除,返回删除元素的数量。鸡肋
      cout<<num<<endl;

      map<string,int>::iterator IT=word.begin();//注意这里IT重新赋值,因为前面删除过一个迭代器,指向不明确了
      map<string,int>::iterator IT1;

      IT1=word.erase(IT);//word.erase.(IT++)  这样。返回的迭代器仍指向下一个迭代器
      cout<<IT1->first<<','<<IT1->second<<endl;

      IT=word.begin();
      IT1=word.end();
      word.erase(IT,IT1);//根据范围迭代器进行删除,返回IT1

      return 0;
}

打印:1

 

            b,2

IT++是自加操作,将IT指向下一个地址并且返回IT原来的副本。参数的处理优先于函数的调用。不信看

 

void func(map<string,int>::iterator it)
{
       cout<<it->first<<','<<it->second<<endl;
}

int main()
{
      map<string,int>word={{"a",1},{"b",2}};
      map<string,int>::iterator IT=word.begin();
      func(IT++);
      cout<<IT->first<<','<<IT->second<<endl;

      return 0;
}

打印:a,1

 

            b,2

 

4.map中元素的查找(find),返回一个迭代器,指向第一个关键字为key的元素,没找到则返回map的尾部迭代器

 

int main()
{
      map<string,int>word={{"a",1}};
      map<string,int>::iterator IT;

      IT=word.find("a");
      cout<<IT->first<<','<<IT->second<<endl;
 
      return 0;
}

打印:a,1

 

 map还有clear(),count(),empty(),size(),swap()等函数

平常学习中,map中对应的关键值只存放一个元素。实际工作中需要存放多个元素,此时关键值变为结构体了。

struct Node
{
      int data;
      int data1;
};

int main()
{
      map<int,Node> Map;//struct标识不需要写进去
      Map.insert(pair<int,Node>(1,{2,3}));
      map<int,Node>::iterator it=Map.begin();
      cout<<it->second.data<<','<<it->second.data1<<endl;

      return 0;
}

打印:2,3

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
是的,Map 接口提供了一些方法来支持使用 Stream 流进行操作。你可以将 Map 转换为 Stream 流,然后使用流的操作方法进行过滤、映射、排序等操作。 下面是一些常用的与 Stream 相关Map 方法: - `entrySet()`: 将 Map 转换为包含键值对的 Set 集合。 - `keySet()`: 将 Map 的键转换为 Set 集合。 - `values()`: 将 Map 的值转换为 Collection 集合。 - `forEach(BiConsumer)`: 对 Map 中的每个键值对执行指定的操作。 - `stream()`: 将 Map 转换为顺序流(Stream)。 - `parallelStream()`: 将 Map 转换为并行流(ParallelStream)。 这些方法可以使你更方便地在 Map 上使用 Stream 流操作。例如,你可以使用 `entrySet()` 方法将 Map 转换为键值对的 Set,然后使用 Stream 流对键值对进行过滤、映射等操作。 以下是一个示例代码,展示了如何使用 Stream 流操作 Map: ```java import java.util.HashMap; import java.util.Map; public class Main { public static void main(String[] args) { Map<String, Integer> map = new HashMap<>(); map.put("A", 1); map.put("B", 2); map.put("C", 3); map.put("D", 4); // 使用 Stream 过滤出值大于 2 的键值对,并打印出结果 map.entrySet() .stream() .filter(entry -> entry.getValue() > 2) .forEach(entry -> System.out.println(entry.getKey() + ": " + entry.getValue())); } } ``` 在上述示例中,我们首先创建了一个包含键值对的 Map。然后,我们使用 `entrySet().stream()` 将 Map 转换为 Stream 流。接着我们使用 `filter()` 方法筛选出值大于 2 的键值对,并使用 `forEach()` 方法打印出结果。输出结果是键 "C" 和对应的值 3。 这只是 Stream 流操作 Map 的一个简单示例,你可以根据具体需求使用不同的流操作方法来对 Map 进行处理。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

盼盼编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值