导航

C++数据结构

Posted on 2022-05-31 22:16  wuqiu  阅读(44)  评论(0编辑  收藏  举报

生成一个随机数

//初始化操作
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");