生成一个随机数
//初始化操作
mt19937 gen(random_device{}());
uniform_int_distribution<int> dis(1, n);//确定生成的范围
int x = dis(gen);//x即为生成的随机数
string类
与C风格的字符串不同,当我们需要知道字符串长度时,可以调用 string 类提供的 length() 函数
string s = "http://c.biancheng.net";
int len = s.length();
cout<<len<<endl;
输出结果为22。由于 string 的末尾没有'\0'字符,所以 length() 返回的是字符串的真实长度,而不是长度 +1。
转换为C风格的字符串
string 类提供了一个转换函数 c_str(),该函数能够将 string 字符串转换为C风格的字符串,并返回该字符串的 const 指针(const char*)
string path = "D:\\demo.txt";
FILE *fp = fopen(path.c_str(), "rt");
insert() 函数可以在 string 字符串中指定的位置插入另一个字符串:
//第一个参数为插入的位置,第二个参数为插入的字符串
string& insert (size_t pos, const string& str);
erase() 函数可以删除 string 中的一个子字符串
//第一个参数为删除位置,第二个参数为删除的长度,如果不指明len的话默认删到结尾
string& erase (size_t pos = 0, size_t len = npos);
substr() 函数用于从 string 字符串中提取子字符串
//pos 为要提取的子字符串的起始下标,len 为要提取的子字符串的长度
string substr (size_t pos = 0, size_t len = npos) const;
find() 函数用于在 string 字符串中查找子字符串出现的位置
//第一个参数为字符串,第二个参数为开始查找的位置
size_t find (const string& str, size_t pos = 0) const;
size_t find (const char* s, size_t pos = 0) const;
rfind() 函数最多查找到第二个参数处,如果到了第二个参数所指定的下标还没有找到子字符串,则返回一个无穷大值4294967295。
to_string()函数可以将int型数据转换为string
//整数浮点都可以这样做
std::string pi = "pi is " + std::to_string(3.1415926);
atoi()函数可以将字符串转为整形
std::string str = "123";
int n = atoi(str.c_str()); // 注意参数是const char 需要转为C风格
cout<<n;
字符串中元素的全排列(任意容器的全排列)
// 如果没有的话返回false,如果有的话返回true 传入的是引用,所以直接改变了num的值;
bool next_permutation (iterator start,iterator end) // 计算下一个排列
bool prev_permutation(iterator start,iterator end)// 计算上一个排列
容器vector
vecotr的常用函数:
resize() // 改变vector元素数量的大小
accumulate(arr.begin(),arr.end(),0); //求从开始到结束容器的和,累加初始值为0
//erase函数返回值是指向删除的最后一个元素的下一位置的迭代器
erase(iterator loc)//删除指定位置loc的元素
erase(iterator first, iterator last); // 删除区间[first, last)的所有元素
insert(iterator loc, const TYPE & val); // 在指定位置loc前插入值为val的元素,返回指向这个元素的迭代器
insert(iterator loc, size_type num, const TYPE & val); // 在指定位置loc前插入num个数值为val的元素 没有返回值
insert(iterator loc, input_iterator first, input_iterator last); // 在指定位置loc前插入区间[first, last)的所有元素 没有返回值
栈
C++ STL中栈的头文件为: #include <stack>
//包含如下函数:
push(); //在栈顶增加元素
pop(); //移除栈顶元素,但是没有返回值
size(); //返回栈中元素数目
top(); //返回栈顶元素,不删除该节点
empty();//堆栈为空则返回真
队列
C++ STL中队列的头文件为: #include <queue>
//包含如下函数:
q.push(x); //入队,将元素 x 从队尾插入(尾插法)
q.pop(); //出队,删除对首元素,但是没有返回值
q.size(); //返回队中元素个数
q.front(); //返回对首元素
q.back(); //返回队尾元素
q.empty(); //判断是否为空(空返回 1,非空返回 0)
关联容器
使用map
不需要开辟空间,不需要初始化,直接以key为索引向为value赋值
map<string,size_t> word_count;
string word;
int n = 0;
while(n++ <= 5){
cin >> word;
++ word_count[word];
}
for( const auto & w : word_count)
cout << w.first <<" "<<w.second<<endl;
使用set
map<string,size_t> word_count;
set<string> exclude = {"The","But","And","Or"};
string word;
int n = 0;
while(n++ <= 5){
cin >> word;
if(exclude.find(word) == exclude.end()) // 如果输入的不在str不在set中
++ word_count[word];
}
for( const auto & w : word_count)
cout << w.first <<" "<<w.second<<endl;
关联容器概述
按关键字 有序/无序 保存元素 | |||
---|---|---|---|
map : 关联数组 保存关键字-值对 | set : 关键字即值,即只保存关键字的容器 | multimap : 关键字可重复出现的map | mutiset : 关键字可以重复出现的set |
unordered_map : 用哈希函数组织的map | unordered_set : 用哈希函数组织的set | unordered_multimap : ··· | unordered_mutiset: ··· |
关联容器操作
关联容器迭代器
map的迭代器 : 可以改变值但是不可以改变键
map<string,size_t> word_count;
auto map_it = word_count.begin();
cout << map_it ->first;
cout << " "<<map_it -> second;
map_it->first = "new_key"; // 错误关键字是const类型的
map_it->second ++; // 正确 可以通过迭代器修改value
++map_it; // 递增迭代器,移动到下一个元素
set的迭代器 : 只是访问,不可改变
set<int> iset = {0,1,2,3,4};
set<int>::iterator set_it = iset.begin();
if(set_it != iset.end()){
*set_it = 42;// 错误关键字是const类型的
cout << *set_it << endl;// 正确 可以通过迭代器修改value
++set_it;// 递增迭代器,移动到下一个元素
}
添加元素
向map中添加元素
//有4种方法
word_count.insert({word,1});
word_count.insert(make_pair(word,1));
word_count.insert(pair<string,size_t>(word,1));
word_count.insert(map<string,size_t>::value_type(word,1));
向set中添加元素
exclude .insert("word");