Problem H: STL——字典(时间优化问题)

注:本题解中所有的代码均已测试,请读者放心阅读

 

这一次我想换个思路,由我错误的代码来引入这篇题解,帮助大家来理解这个时间问题,

1.cin和c语言中的scanf输入数据的耗时差距比较大

scanf是用指针操作的,没有类型安全机制。比如一个char类型数据你就可以用%f获得输入,而不会报错,但在运行时会出现异常。
cin是自动判断你的变量类型,比如一个char数据只能用默认的char方法取数据。

标准流对象cin/cout为了普适性,继承体系很复杂,所以在对象的构造等方面会影响效率,因此总体效率比较低。
cin有许多额外的开销,可以用std::ios::sync_with_stdio(false)或ios::sync_with_stdio(false);cin.tie(0);,这样就可以取消cin于stdin的同步了。
2.最后的清空map很重要(这个是我导致worng Answer67%的原因)

这个就不多说了,就是最后的a.clear()的问题,因为如果最后不清除的话,上次样例会一直存在map中,影响后面的判断;

3.采用迭代器遍历一定要考虑时间问题(这是最重要的)


前两个的时间复杂度都明显低于最后一个,我去网上搜题解的时候不知道为什么有的大神用第三种还能写对,在下佩服,我就好奇的粘了一个测试发现,额

这不是坑人吗?不试试的话,还真挺对的,哈哈,言归正传哈,咱下面就来分析题解思路;

这个思路呢分为两种,这第一种呢,就是第一张图片上用count的那个

大题思路就是:咱不是要寻找元素吗,我直接a.count(要寻找的字符串),如果在map中没找到的话,那么这个返回值就是0了,count顾名思义是数量,以返回值为条件进行判断再输出对应的结果,代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

#include <iostream>

#include <string>

#include <map>

using namespace std;

int main(){

    ios::sync_with_stdio(false);

    int n;

    map<string,string> a;

    while(cin>>n)

      {

    while(n--)

      {

        string s1,s2;

        cin>>s1>>s2;

        a[s2]=s1;

      }

     int N;

     cin>>N;

     while(N--)

     {

        string x;

        cin>>x;

        if(a.count(x)!=0)

            cout<<a[x]<<endl;

        else

            cout<<"eh"<<endl;

     }

     a.clear();

    }

  

    return 0;

} 

这第二种呢就剩find函数了,这里还要拓展一下map容器中find函数的返回值问题,

map的find(s)成员,目的是在map中查找关键字s的pair,找到后返回指向关键字为s的pair的迭代器,找不到那么就会返回尾后迭代器,切记迭代器其实就是一个指针,用迭代器访问pair的first或者second成员方法是:iter->first 或 iter -> second,不能用.号。(原文链接:https://blog.csdn.net/digitalkee/article/details/122731329)。

这里要注意几点:1.要查找的字符串一定要为map的关键字(key),即要查找的字符串所在的那一类为key,这个地方很好设,在构造函数map的时候颠倒输入的赋值顺序就好了;2.find函数未找到的时候返回的是a.end(),所以要给find初始化为一个迭代器变量,再进行查找。

代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

#include <iostream>

#include <string>

#include <map>

using namespace std;

int main(){

    ios::sync_with_stdio(false);

    int n;

    while(cin>>n)

    {  map<string,string> a;

       while(n--)

      {

        string s1,s2;

        cin>>s1>>s2;

        a.insert(make_pair(s2,s1));

      }

     int N;

     cin>>N;

     while(N--)

     {

        string x;

        cin>>x;

        int t=0;

        map<string ,string> ::iterator p=a.find(x);

        if(p!=a.end())

        {

            cout<<p->second<<endl;

            t=1;

        }

            if(t==0)

                cout<<"eh"<<endl;

     }

     a.clear();

    }

    return 0;

}

以上就是我对本体的片面的理解,希望与大家共享。

                                                                                                                记录当下,我的编程之路。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值