日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Shoping(map)

發布時間:2024/1/1 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Shoping(map) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

ACM之map

    • 關于map:
    • hash_map
        • 默認hash 和比較函數
        • hash_map 的比較函數
        • hash_map(size_type n)
        • map與hash_map
    • 題目:
    • 我的代碼:

關于map:

map的特性是,所有元素都會根據元素的減值自動被排序。 map的所有元素都是pair,同時擁有實值(value)和鍵值(key)。
pair的第一個元素會被視為鍵值,第二個元素會被視為實值。 map不允許兩個元素擁有相同的鍵值。
key值不可修改!

map中插入元素:
注意后加入的在 begin一側,即后入的排在前面;
可利用rbegin 和 rend 反轉輸出,得到正確的順序

//第一種 map[key]=value; //第二種 map<int,string> maplive; pair<int,string> value(1,"a"); maplive.insert(value);

begin() 返回指向map頭部的迭代器
end() 返回指向map末尾的迭代器
clear() 刪除所有元素
count() 返回指定元素出現的次
empty() 如果map為空則返回true
erase() 刪除一個元素
find() 查找一個元素
get_allocator() 返回map的配置器
insert() 插入元素
key_comp() 返回比較元素key的函數
lower_bound() 返回鍵值>=給定元素的第一個位置
max_size() 返回可以容納的最大元素個數
rbegin() 返回一個指向map尾部的逆向迭代器
rend() 返回一個指向map頭部的逆向迭代器

size() 返回map中元素的個數
swap() 交換兩個map
upper_bound() 返回鍵值>給定元素的第一個位置
value_comp() 返回比較元素value的函數

hash_map

hash_map是基于hash table(哈希表)。
哈希表最大的優點,就是把數據的存儲和查找消耗的時間大大降低,幾乎可以看成是常數時間;而代價僅僅是消耗比較多的內存。然而在當前可利用內存越來越多的情況下,用空間換時間的做法是值得的。另外,編碼比較容易也是它的特點之一。
基本原理:使用一個下標范圍比較大的數組來存儲元素。可以設計一個函數(哈希函數,也叫做散列函數),使得每個元素的關鍵字都與一個函數值(即數組下標,hash值)相對應,于是用這個數組單元來存儲這個元素;也可以簡單的理解為,按照關鍵字為每一個元素“分類”,然后將這個元素存儲在相應“類”所對應的地方,稱為桶。
不能夠保證每個元素的關鍵字與函數值是一一對應的,因此極有可能出現對于不同的元素,卻計算出了相同的函數值,這樣就產生了“碰撞” —— 把不同的元素分在了相同的桶之中
hash_map,首先分配一大片內存,形成許多桶。是利用hash函數,對key進行映射到不同區域(桶)進行保存
插入過程
得到key
利用hash函數得到hash值
得到桶值(一般用hash值對桶的個數求余)
存放key和value在桶內
取值過程:
得到key值
計算hash值
得到桶號
查找該桶內是否有和key值相同的,若無,則未找到(比較函數)
若有,返回找到的值

默認hash 和比較函數

#include<iostream> using namespace std; #include<hash_map> #include<string>hash_map<int,string> myHash; myHash[100] = "100"; myHash[900] = "900";hash_map::iterator iter =myHash.find(100); if(iter != myHash.end()) ..... //未聲明hash函數和比較函數的,將使用默認的; hash_map<int, string> myMap; //等同于: hash_map<int, string, hash<int>, equal_to<int> > myMap; struct hash<int> {size_t operator()(int __x) const { return __x; } };

key值只要是下列的類型,就可以不寫hash函數

struct hash<char*> struct hash<const char*> struct hash<char> struct hash<unsigned char> struct hash<signed char> struct hash<short> struct hash<unsigned short> struct hash<int> struct hash<unsigned int> struct hash<long> struct hash<unsigned long>

若沒有則必須自定義hash函數,如string類

struct str_hash{size_t operator()(const string& str) const{unsigned long __h = 0;for (size_t i = 0 ; i < str.size() ; i ++)__h = 5*__h + str[i];return size_t(__h);} }; //如果你希望利用系統定義的字符串hash函數,你可以這樣寫: struct str_hash{size_t operator()(const string& str) const{return __stl_hash_string(str.c_str());} };

在聲明自己的哈希函數時要注意以下幾點:

使用struct,然后重載operator().
返回是size_t
參數是你要hash的key的類型。
函數是const類型的。

hash_map 的比較函數

在map中的比較函數,需要提供less函數。
如果沒有提供,缺省的也是less< Key>
在hash_map中,要比較桶內的數據和key是否相等,因此需要的是是否等于的函數:equal_to< Key> 。
equal_to 源碼:

//本代碼可以從SGI STL //先看看binary_function 函數聲明,其實只是定義一些類型而已。 template <class _Arg1, class _Arg2, class _Result> struct binary_function {typedef _Arg1 first_argument_type;typedef _Arg2 second_argument_type;typedef _Result result_type; }; //看看equal_to的定義: template <class _Tp> struct equal_to : public binary_function<_Tp,_Tp,bool> {bool operator()(const _Tp& __x, const _Tp& __y) const { return __x == __y; } };

若是自定義的類型,則需要自己構建compare函數:

使用equal_to< mystruct>作為比較函數

struct mystruct{int myID;int value;bool operater== (const mystruct &my) const{return (myId == my.myID) && (value == my.value);}};

實現:

hash_map(mystruct,int,hash_str,equal_to<mystruct>) myHash;

構建函數對象

struct compare_str{bool operature()(const char* p1, const char* p2) const{return strcmp(p1,p2)==0;}};

實現:

hash_map(const char*,string,hash<char*>, compare_str);

hash_map(size_type n)

如果講究效率,這個參數是必須要設置的。
n 主要用來設置hash_map容器中hash桶的個數。桶個數越多,hash函數發生沖突的概率就越小,重新申請內存的概率就越小。
n越大,效率越高,但是內存消耗也越大。
const_iterator find(const key_type& k) const. 用查找,輸入為鍵值,返回為迭代器。

data_type& operator[](const key_type& k)

像使用數組一樣使用。
不過需要注意的是,當你使用[key]操作符時,如果容器中沒有key元素,這就相當于自動增加了一個key元素。因此當你只是想知道容器中是否有key元素時,你可以使用find。如果你希望插入該元素時,你可以直接使用[ ]操作符。
insert

在容器中不包含key值時,insert函數和[]操作符的功能差不多。但是當容器中元素越來越多,每個桶中的元素會增加,為了保證效率,hash_map會自動申請更大的內存,以生成更多的桶。
因此在insert以后,以前的iterator有可能是不可用的
erase 函數。

在insert的過程中,當每個桶的元素太多時,hash_map可能會自動擴充容器的內存。
erase并不自動回收內存。因此你調用erase后,其他元素的iterator還是可用的。

map與hash_map

構造函數。hash_map需要hash函數,等于函數;map只需要比較函數(小于函數).
存儲結構。hash_map采用hash表存儲,map一般采用紅黑樹(RB Tree)實現。因此其memory數據結構是不一樣的。

總體來說,hash_map 查找速度會比map快,而且查找速度基本和數據數據量大小,屬于常數級別;而map的查找速度是log(n)級別。并不一定常數就比log(n)小,hash還有hash函數的耗時,明白了吧,如果你考慮效率,特別是在元素達到一定數量級時,考慮考慮hash_map。但若你對內存使用特別嚴格,希望程序盡可能少消耗內存,那么一定要小心,hash_map可能會讓你陷入尷尬,特別是當你的hash_map對象特別多時,你就更無法控制了,而且hash_map的構造速度較慢。

#include <hash_map> #include <string> #include <iostream>using namespace std; //define the class class ClassA{public:ClassA(int a):c_a(a){}int getvalue()const { return c_a;}void setvalue(int a){c_a;}private:int c_a; };//1 define the hash function struct hash_A{size_t operator()(const class ClassA & A)const{// return hash<int>(classA.getvalue());return A.getvalue();} };//2 define the equal function struct equal_A{bool operator()(const class ClassA & a1, const class ClassA & a2)const{return a1.getvalue() == a2.getvalue();} };int main() {hash_map<ClassA, string, hash_A, equal_A> hmap;ClassA a1(12);hmap[a1]="I am 12";ClassA a2(198877);hmap[a2]="I am 198877";cout<<hmap[a1]<<endl;cout<<hmap[a2]<<endl;return 0; } -bash-2.05b$ make my c++ -O -pipe -march=pentiumpro my.cpp -o my -bash-2.05b$ ./my I am 12 I am 198877

題目:

Shopping
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 6924 Accepted Submission(s): 2438

Problem Description
Every girl likes shopping,so does dandelion.Now she finds the shop is increasing the price every day because the Spring Festival is coming .She is fond of a shop which is called “memory”. Now she wants to know the rank of this shop’s price after the change of everyday.

Input
One line contians a number n ( n<=10000),stands for the number of shops.
Then n lines ,each line contains a string (the length is short than 31 and only contains lowercase letters and capital letters.)stands for the name of the shop.
Then a line contians a number m (1<=m<=50),stands for the days .
Then m parts , every parts contians n lines , each line contians a number s and a string p ,stands for this day ,the shop p 's price has increased s.

Output
Contains m lines ,In the ith line print a number of the shop “memory” ‘s rank after the ith day. We define the rank as :If there are t shops’ price is higher than the “memory” , than its rank is t+1.

Sample Input
3
memory
kfc
wind
2
49 memory
49 kfc
48 wind
80 kfc
85 wind
83 memory

Sample Output
1
2

我的代碼:

#include <bits/stdc++.h>using namespace std;int main() {int n, m, p;map< string, int> shop;while(cin>>n){string s; //僅用于輸入商店名字for(int i=1; i<=n; i++)cin>>s;cin>>m;while(m--){for(int i=1; i<=n; i++){cin>>p>>s;shop[s] += p;}int rank = 1; //排名map<string,int>::iterator it;for(it = shop.begin(); it != shop.end(); it++)if(it->second > shop["memory"])rank++;cout<<rank<<endl;}shop.clear();}return 0; }

總結

以上是生活随笔為你收集整理的Shoping(map)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 99免费在线观看 | 日韩av影片在线观看 | 中文字幕一区二区人妻痴汉电车 | 日韩黄色影院 | 欧美一级免费视频 | 99re6热在线精品视频播放 | 欧洲一区二区在线 | 国模无码一区二区三区 | 在线99视频 | 国产精品高潮呻吟久久av黑人 | 公侵犯人妻一区二区三区 | 一区二区在线国产 | 91欧美激情一区二区三区 | 久久国产视频网站 | 夜夜爽妓女8888视频免费观看 | 大陆女明星乱淫合集 | 一区二区欧美在线 | 久久一级视频 | 天天插夜夜操 | 久久精品一级片 | gv天堂gv无码男同在线观看 | www日韩在线| 激情婷| 日本高清不卡在线观看 | 大尺度一区二区 | 亚洲精选91| 女性向av免费网站 | 欧美亚洲国产日韩 | 17草在线| 51吃瓜网今日吃瓜 | 夜夜骚av| 成人国产片 | 色呦呦在线播放 | 久久精品国产99精品国产亚洲性色 | 91成人精品视频 | 少妇第一次交换又紧又爽 | 搞黄视频在线观看 | 中文字幕天堂av | 国产成人精品一区二区三区网站观看 | av手机天堂 | 国产一级高清视频 | 特种兵之深入敌后 | 日韩国产欧美精品 | 亚州中文字幕 | xxxx国产片 | 波多野久久 | 日韩欧美中文字幕在线视频 | 久久久久久久久久久久久久国产 | 就操在线 | 在线观看黄色动漫 | 人妻少妇无码精品视频区 | 国产成人久久婷婷精品流白浆 | 国产人人爽 | 日韩欧美精品中文字幕 | a天堂亚洲 | 性生交大片免费看l | 精品伦精品一区二区三区视频密桃 | 国产三级三级看三级 | 国产欧美a | 国产91综合 | 国产91网| 欧美人成在线 | 手机在线看永久av片免费 | 欧美男人亚洲天堂 | 麻豆md0034在线观看 | 欧美在线a | 91成人高清 | 一级福利片| 永久免费在线观看视频 | 国产一级理论片 | 久久婷婷亚洲 | 久久久久久久久97 | 亚洲大片免费观看 | 九九超碰| 欧美综合精品 | 两根大肉大捧一进一出好爽视频 | 91一区在线观看 | av黄色片在线观看 | 香蕉久久国产 | 久久久久久天堂 | av色图在线 | 深夜视频在线免费 | 欧美激情h | www.com黄色 | 日韩av一区在线 | 日本a级黄| 抖音视频在线观看 | 1024你懂的日韩 | 992在线观看 | 欧美xxxxx少妇 | 久久新| 色婷婷av一区二区三区之红樱桃 | 成人国产免费观看 | 久久看看 | 婷婷色在线视频 | 天天射日日操 | 美女100%露胸无遮挡 | 国产一区二区三区四区 | 国产乱人乱精一区二视频国产精品 |