#include<iostream>
#include<string>
#include<fstream>
#include<vector>
#include<map>
#include<cctype>/*包含tolower()函数和ispunct函数;ispunct() 函数用来检测一个字符是否为标点符号或特殊字符*/
#include<algorithm>
using namespace std;
int main(int argc, char**argv)
{
//map的定义
map<string,size_t> word_count;
fstream in("1.txt");//定义一个输入流
string word;
while (in>>word)
{
string::iterator it1;
for (it1 = word.begin(); it1 != word.end(); ++it1)
{
*it1 = tolower(*it1);
}//消灭大小写,把字符转换成小写字母,非字母字符不做出处理用 法: int tolower(int c); *解引用
word.erase(remove_if(word.begin(), word.end(), ispunct),word.end());//消灭标点符号
++word_count[word];
}
//map同样支持迭代器操作
map<string ,size_t>::iterator mapi;
for (mapi = word_count.begin(); mapi != word_count.end(); ++mapi)//C++ 11支持:const auto &s : word_count
{
//两个成员分别代表关键字和对应值
cout<<mapi->first<<" ";
cout<<mapi->second<<" "<<endl;
}
return 0;
}
#include<iostream>
#include<string>
#include<fstream>
#include<vector>
#include<map>
#include<cctype>//,包含tolower()函数和ispunct函数
#include<algorithm>
using namespace std;
//map关键字是家庭的姓,值是一个vector保存家中孩子们的名
int main(int argc, char**argv)
{
//map的定义
map<string,vector<string>> family;
string first_name,child_name;
//在while中使用lambda语句,可以传入多条语句参数,将我们想要传入的输出参数也放在其中,注意后面的一对括号
while ( [&]()->bool {cout<<"请输入家庭的姓:"; return cin>>first_name && (first_name != "end");}() )
{
cout<<"请输入孩子的名字:";
while (cin>>child_name && (child_name != "end"))
{
family[first_name].push_back(child_name);
}
}
//map同样支持迭代器操作
map<string ,vector<string>>::iterator mapi;
for (mapi = family.begin(); mapi != family.end(); ++mapi)//C++ 11支持:const auto &s : word_count
{
//两个成员分别代表关键字和对应值
cout<<mapi->first<<" :";
vector<string>::iterator it1 = mapi->second.begin();
for (it1; it1 != mapi->second.end(); ++it1)
{
cout<<*it1<<" ";
}
}
return 0;
}
#include <iostream>
#include <map>
#include <set>
#include <string>
#include <utility> //pair
using namespace std;
map<string,size_t> word_count;
set<string> exclude; //使用set忽略常见单词={"The","But"}
string word;
void main(){
/*while(cin>>word) if(exclude.find(word) == exclude.end()) ++word_count[word]; //使用关联数组map:提取word的计数器并+1
//find调用返回一个迭代器,如果给定关键字在set中,迭代器指向该关键字。否则,find返回尾后迭代器*/
while(cin>>word){
auto ret=word_count.insert(pair<string,size_t>(word,1));
if(!ret.second) ++ret.first->second;
}
/* ++((ret.first)->second);
ret保存insert返回的值,是一个pair
ret.first是pair的第一个成员,是一个map迭代器,指向具有给定关键字的元素;第二个元素是bool表明是否插入成功
ret.first->解引用此迭代器,提取map中元素,元素是一个pair
*/
string removal_word="a";
if(word_count.erase(removal_word))
cout<<removal_word<<" removed\n";
else cout <<removal_word<<" not found\n";
//erase 对于不重复关键字的容器,erase的返回值总是0或1。对允许重复关键字的容器,删除元素的数量可能大于1
for(const auto &w:word_count)
cout<<w.first<<" occurs "<<w.second<<((w.second>1)?" times":" time")<<endl;
system("pause");
/*打印操作,当使用一个迭代器遍历关联容器,迭代器按关键字升序遍历元素
auto map_it = word_count.cbegin();
while(map_it!= word_count.cend()){
cout<<map_it->first<<" occurs"<<map_it->second<<" times"<<endl;
++map_it;//递增迭代器,移动到下一个元素
*/
}