// chapter-11.cpp : 定義控制臺應用程序的入口點牢裳。
//
#include "stdafx.h"
#include<iostream>
#include<string>
#include<map>
#include<set>
#include<utility> //定義了pair類型!
#include<vector>
#include<fstream>
#include<deque>
using namespace std;
class Info_Stu
{
public:
Info_Stu() = default;
Info_Stu(const string &a,const double b):id(a),grades(b){}
string get_id()const { return id; }
double get_grade()const { return grades; }
private:
string id;
double grades;
};
bool compare_info_stu(const Info_Stu &lh, const Info_Stu &rh)
{
return lh.get_id() < rh.get_id();
}
map<string, string> bulid_map_format(ifstream &in_format)
{
string tmp;
map<string, string> ret;
while (getline(in_format,tmp))
{
auto pos = tmp.find('=');
if (pos!=string::npos)
{
string key_ret = tmp.substr(0, pos);
ret[key_ret] = tmp.substr(pos+1, tmp.size() -pos-1);
}
}
return ret;
}
int main()
{
//按關鍵字有序保存元素
//map 關鍵字--值
//set 關鍵字息尺,只保存關鍵字
//multimap 關鍵字可重復
//multiset 關鍵字可重復
//無序集合
//unordered_map 關鍵字無序儲存讨永,使用哈希函數(shù)儲存元素
//unordered_set 關鍵字無序儲存酪耳,使用哈希函數(shù)儲存元素
//unordered_multimap 無序劣光、可重復
//unordered_multiset 無序国觉、可重復
//使用map做單詞計數(shù)程序!
map<string, size_t> word_count; //數(shù)組下標通常定義為size_t
string word;
unsigned total=2;
while (total>0)
{
if (cin >> word)
{
++word_count[word]; //map下標運算符返回為左值嫡良,可以進行讀寫操作!
--total;
}
}
for (const auto &r : word_count) //得到pair類型的對象献酗!
{
cout << r.first << ":" << r.second <<" "<<((r.second>1)?"times":"time")<< endl;
}
cout << endl;
//添加set過濾統(tǒng)計字符串
set<string> exclude = { "the","and","but" };
for (const auto &r : word_count) //得到pair類型的對象寝受!
{
if(exclude.cend()==exclude.find(r.first))
cout << r.first << ":" << r.second << " " << ((r.second>1) ? "times" : "time") << endl;
}
//關聯(lián)容器支持順序容器基本操作(初始化、互換等等)罕偎,但是不支持push_back等很澄,因為關聯(lián)容器是根據(jù)關鍵字儲存的!
//有序關聯(lián)容器的關鍵字元素類型必須定義元素的比較方法颜及,默認情況下使用<運算符來比較關鍵字甩苛!對于shared_ptr,則還需要定義刪除器俏站!
set<Info_Stu, decltype(compare_info_stu)*> student_2017(compare_info_stu);
//pair,可以通過first和second來訪問成員讯蒲!
pair<string, size_t> word_the{ "the",3 };
cout << word_the.first << ":" << word_the.second <<" "<<"times"<< endl;
//pair<T1,T2> p(v1,v2) / pair<T1,T2> p={v1,v2} /pair<T1,T2> p; 初始化形式!
//make_pair(v1,v2) 返回一個pair
//p.first和p.second 返回對應的成員
//p1 < p2 pair可以進行關系比較乾翔,其實質(zhì)為first和second進行比較!
//p1==p2 pair可以進行XX比較施戴,其是指為利用元素的==運算符實現(xiàn)反浓!
//關聯(lián)容器操作
//key_type 此容器類型的關鍵字類型
//mapped_type 每個關鍵字關聯(lián)的類型:只適用于map
//value_type 對于set,與key_type相同赞哗;對于map雷则,為pair<const key_value,mapped_type>
map<string, unsigned>::mapped_type val_1;
//關聯(lián)容器的迭代器,當解引用迭代器時肪笋,會得到value_type的值引用月劈!
//set的迭代器是const的度迂,只能讀取關鍵字,但是不能修改猜揪!map的關鍵字也不能修改惭墓!關聯(lián)容器的關鍵字都不能修改!
//通常不要對關聯(lián)容器使用泛型算法而姐,因為set和map的關鍵字均為const腊凶!
//插入元素,set
vector<int> ivec_insert_set = { 1,2,3,4,4,3,2,1 };
set<int> iset_inserted;
iset_inserted.insert(ivec_insert_set.cbegin(),ivec_insert_set.cend());
iset_inserted.insert({ 1,2,3,4,5 });
auto beg = iset_inserted.cbegin();
for (; beg != iset_inserted.cend(); ++beg)
{
cout << *beg << " ";
}
cout << endl;
//插入元素,map
map<string, size_t> imap_inserted;
imap_inserted.insert({ "and",6 }); //插入的元素必須為pair
//c.insert(v)/c.emplace(args)/c.insert(b,e)/c.insert(il)/c.insert(p,v)/c.emplace(p.args)
//insert的返回類型依賴于容器類型和參數(shù),對于不包含重復關鍵字的容器拴念,返回pair钧萍。first為迭代器,指向給定關鍵字的元素(map的元素為pair)政鼠;second為布爾值风瘦,指出元素是否插入成功!(若給multiset和multimap插入元素公般,則只返回一個指向新元素的迭代器万搔,因為插入肯定是成功的!)
auto ret = imap_inserted.insert(make_pair("but", 9));
cout << (ret.first->first) <<":"<< ret.second << endl;
//刪除元素
//c.erase(k) 刪除關鍵字為k的元素,返回刪除元素的個數(shù)(size_t)
//c.erase(p) 刪除迭代器p指向的元素俐载,返回p之后元素的迭代器
//c.erase(b,e) 刪除b到e中所有元素蟹略,返回e。
//map的下標操作遏佣,只適用于非const的map和unordered_map挖炬!容器含有下標運算符和at函數(shù)!set不支持下標操作状婶!
cout << imap_inserted.at("and") << endl; //當使用下標運算符[]意敛,若關鍵字k不存在,則添加關鍵字為k的元素膛虫!使用at函數(shù)草姻,若關鍵字k不存在(帶參數(shù)檢查),則k不存在拋出異常稍刀!
//訪問元素
//c.find(k) 返回指向關鍵字為k的元素迭代器撩独,若k不在容器中,返回尾后迭代器
//c.count(k) 統(tǒng)計關鍵字為k的元素的數(shù)量
//c.lower_bound(k) 返回一個迭代器账月,指向第一個關鍵字不小于k的元素综膀。lower_bound和upper_bound不適用于無序容器!
//c.upper_bound(k) 返回一個迭代器局齿,指向第一個關鍵字大于k的元素剧劝。若lower_bound和upper_bound返回相同的迭代器,則給定關鍵字不存在抓歼!
//c.equal_range(k) 返回一個迭代器pair讥此,指向關鍵字等于k的元素的范圍拢锹!
for (auto pos = imap_inserted.equal_range("but"); pos.first != pos.second; ++pos.first)
{
cout << pos.first->first << ":" << pos.first->second << " " << "times";
}
cout << endl;
ifstream in_format("C:/Users/winack/Documents/Visual Studio 2017/Projects/chapter-11/format.txt");
map<string, string> format_string;
if (in_format)
{
format_string = bulid_map_format(in_format);
}
in_format.close();
//map<string, string> format_string = { {"k","okay"},{"y","you"},{"r","are"} };
deque<string> in_string;
ifstream in_file("C:/Users/winack/Documents/Visual Studio 2017/Projects/chapter-11/1.txt");
if(in_file)
{
string tmp;
while (in_file>>tmp)
{
auto find_tmp = format_string.find(tmp);
if (find_tmp != format_string.cend())
{
tmp = find_tmp->second;
}
in_string.push_back(tmp);
}
}
in_file.close();
for (auto &r : in_string)
{
cout << r << " ";
}
ofstream out_file("C:/Users/winack/Documents/Visual Studio 2017/Projects/chapter-11/2.txt");
if (out_file)
{
for (auto &r : in_string)
{
out_file << r << " ";
}
}
out_file.close();
//無序容器,使用哈希函數(shù)和關鍵字類型==運算符萄喳,在關鍵字沒有明顯的序關系時維護元素的序列代價非常高昂時卒稳,無序容器很有用!
//取胎?展哭??闻蛀?匪傍??觉痛?役衡?
system("pause");
return 0;
}
//關聯(lián)容器的元素是按關鍵字來保存和訪問的;順序容器是按在容器中的位置順序來保存和訪問的薪棒!
chapter-11
最后編輯于 :
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
- 文/潘曉璐 我一進店門吨述,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人钞脂,你說我怎么就攤上這事揣云。” “怎么了冰啃?”我有些...
- 文/不壞的土叔 我叫張陵邓夕,是天一觀的道長。 經(jīng)常有香客問我阎毅,道長焚刚,這世上最難降的妖魔是什么? 我笑而不...
- 正文 為了忘掉前任净薛,我火速辦了婚禮汪榔,結(jié)果婚禮上蒲拉,老公的妹妹穿的比我還像新娘肃拜。我一直安慰自己痴腌,他們只是感情好,可當我...
- 文/花漫 我一把揭開白布燃领。 她就那樣靜靜地躺著士聪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪猛蔽。 梳的紋絲不亂的頭發(fā)上剥悟,一...
- 文/蒼蘭香墨 我猛地睜開眼种玛,長吁一口氣:“原來是場噩夢啊……” “哼藐鹤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起赂韵,我...
- 正文 年R本政府宣布,位于F島的核電站月趟,受9級特大地震影響灯蝴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜孝宗,卻給世界環(huán)境...
- 文/蒙蒙 一穷躁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧因妇,春花似錦问潭、人聲如沸猿诸。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽梳虽。三九已至,卻和暖如春灾茁,著一層夾襖步出監(jiān)牢的瞬間窜觉,已是汗流浹背。 一陣腳步聲響...
推薦閱讀更多精彩內(nèi)容
- Words & Phrases No.1 massacre. to kill a lot of people or...
- Vocabulary: 1. I think we should banish驅(qū)逐腻格,趕走,此處可為不再提及all ...
- Expressions ...don’t be buffaloed into the idea that it’s...
- Most of us just like the conceited man who being visited ...