C++ STL学习

it2025-06-19  11

文章目录

Vector简单的遍历迭代器遍历使用erase进行删除指定元素vector求交并集,去重 转化vector转数组数组转vector map插入查找删除 unordered_mapsetunordered_setStackQueue一些常用的库Demonext_permutation/prev_permutationcountsortlower_bound/upper_boundFind其他

Vector

简单的遍历

#include <iostream> #include <vector> #include <queue> using namespace std; int main() { vector<int> v1(5,42);//生成一个具有5个42的vector v1.push_back(1);//add for(int k = 0 ; k<v1.size() ; k++){//遍历 cout<<v1[k]<<"\n"; } return 0; }

迭代器遍历

#include <iostream> #include <vector> #include <queue> using namespace std; int main() { vector<int> v1; vector<int>:: iterator iter; v1.push_back(1); v1.push_back(2); v1.push_back(3); v1.push_back(4); v1.push_back(5); cout<<v1.front()<<"\n";//返回第一个元素 cout<<v1.back()<<"\n";//返回最后一个元素 for(iter = v1.begin() ; iter!=v1.end() ; iter++){//使用迭代器的方式进行vector的遍历 cout<<*iter<<"\n"; } v1.clear();//清空元素 bool b = v1.empty();//判断元素是否为空 return 0; }

使用erase进行删除指定元素

#include <iostream> #include <vector> #include <queue> using namespace std; int main() { vector<int> v1; vector<int>:: iterator iter; v1.push_back(1); v1.push_back(2); v1.push_back(3); v1.push_back(4); v1.push_back(5); for(iter = v1.begin();iter!=v1.end();iter++){ if(*iter%2==0){ v1.erase(iter);//erase删除指定vector的元素,入参必须得是迭代器 v1.insert(iter,1,100);//在指定位置插入, //第一个参数的val的迭代器,第二个是插入数量,第三个是插入的val } } for(iter = v1.begin();iter!=v1.end();iter++){ cout<<*iter<<"\n"; } return 0; } /** 1 100 3 100 5 */

vector求交并集,去重

去重

int main() { vector<int>v1; vector<int>::iterator iter; v1.push_back(2); v1.push_back(1); v1.push_back(0); v1.push_back(11); v1.push_back(11); v1.push_back(199); v1.push_back(199); sort(v1.begin(),v1.end()); iter = unique(v1.begin(),v1.end());//获取需要去重的迭代器 if(iter!=v1.end()){ v1.erase(iter,v1.end());//删除重复的迭代器 } for (iter = v1.begin(); iter != v1.end(); iter++) { cout<<*iter<<"\n"; } return 0; }

交集

vector<int> intersect(vector<int>& nums1, vector<int>& nums2) { sort(nums1.begin(),nums1.end()); sort(nums2.begin(),nums2.end()); vector<int> v; set_intersection(nums1.begin(),nums1.end(),nums2.begin(),nums2.end(),back_inserter(v)); return v; }

并集

vector<int> intersect(vector<int>& nums1, vector<int>& nums2) { sort(nums1.begin(),nums1.end()); sort(nums2.begin(),nums2.end()); vector<int> v; set_union(v1.begin(),v1.end(),v2.begin(),v2.end(),back_inserter(v)); return v; }

转化

vector转数组

vector<int> previousPermuation(vector<int> &nums) { // write your code here char charArr[nums.size()]; memcpy(charArr,&nums[0],nums.size()*sizeof(nums[0])); }

数组转vector

vector<int> v(N) memcpy(&V[0], array, sizeof(array))

map

map底层基于红黑树,会自动按照key的大小进行升序排序,map相当于java的TreeMap,unordered_map相当于java的HashMap。 以下介绍一下map的几种常用操作

插入

map的插入有三种方法

使用pair进行插入 int main() { map<int,string>::iterator iter; map<int,string> map1; map1.insert(pair<int,string> (1,"张三")); map1.insert(pair<int,string> (2,"张三")); for (iter = map1.begin(); iter !=map1.end(); iter++){ cout<<iter->first<<" "<<iter->second<<"\n"; } }

另说一点,插入成功的前提条件是key不能一样,不然会被覆盖。

使用value_type进行插入 int main() { map<int,string>::iterator iter; map<int,string> map1; map1.insert(map<int,string>::value_type (1,"张三")); map1.insert(map<int,string>::value_type (2,"张三")); for (iter = map1.begin(); iter !=map1.end(); iter++){ cout<<iter->first<<" "<<iter->second<<"\n"; } } 使用数组进行插入 int main() { map<int,string>::iterator iter; map<int,string> map1; map1[1] = "张三"; map1[2] = "张三"; for (iter = map1.begin(); iter !=map1.end(); iter++){ cout<<iter->first<<" "<<iter->second<<"\n"; } }

查找

查找的方法两种:

map的count函数,可以统计key的数量,因为key是唯一的,所以只会有1和0,但是我们无法找到其迭代器的位置,当然了,map是有序进行insert的。 int main() { map<int,string>::iterator iter; map<int,string> map1; map1.insert(map<int,string>::value_type (1,"张三")); map1.insert(map<int,string>::value_type (2,"张三")); int num = map1.count(1); cout<<num<<endl;//1 // for (iter = map1.begin(); iter !=map1.end(); iter++){ // cout<<iter->first<<" "<<iter->second<<"\n"; // } } find函数,实际上就是查询其迭代器的坐标 int main() { map<int,string>::iterator iter; map<int,string> map1; map1.insert(map<int,string>::value_type (1,"张三")); map1.insert(map<int,string>::value_type (2,"张三")); iter = map1.find(2); if(iter!=map1.end()){ cout<< iter->first << " " << iter->second << endl;//2 张三 } // for (iter = map1.begin(); iter !=map1.end(); iter++){ // cout<<iter->first<<" "<<iter->second<<"\n"; // } }

删除

map的删除也是用erase来实现的。

清除整个map map1.erase(map1.begin(),map1.end()); 删除map的某个迭代器 iter = map1.find(2); map1.erase(iter);

unordered_map

unordered_map和java的hashmap的性质是一样的。

常见成员函数如下: 迭代器 begin   返回指向容器起始位置的迭代器(iterator) end    返回指向容器末尾位置的迭代器 cbegin  返回指向容器起始位置的常迭代器(const_iterator) cend    返回指向容器末尾位置的常迭代器 Capacity size    返回有效元素个数 max_size 返回 unordered_map 支持的最大元素个数 empty 判断是否为空 元素访问 operator[]    访问元素 at        访问元素 元素修改 insert   插入元素 erase   删除元素 swap    交换内容 clear   清空内容 emplace  构造及插入一个元素 emplace_hint 按提示构造及插入一个元素 操作 find       通过给定主键查找元素,没找到:返回unordered_map::end count      返回匹配给定主键的元素的个数 equal_range   返回值匹配给定搜索值的元素组成的范围 Buckets bucket_count    返回槽(Bucket)数 max_bucket_count 返回最大槽数 bucket_size     返回槽大小 bucket       返回元素所在槽的序号 load_factor     返回载入因子,即一个元素槽(Bucket)的最大元素数 max_load_factor   返回或设置最大载入因子 rehash       设置槽数 reserve       请求改变容器容量

int main() { unordered_map<int, string> dict; unordered_map<int, string>::iterator iter; //插入数据的三种方法 dict.insert(pair<int, string>(1, "value1")); dict.insert(unordered_map<int, string>::value_type(2, "value2")); dict[3] = "value3"; //判断unordered_map内是否为空 if (dict.empty()) { cout << "空的" << endl; } else { cout << "不空" << endl; } //查找某个键值对是否存在 if (dict.count(1) == 0) { cout << "不存在key为1的键值对" << endl; } else { cout << "存在key为1的键值对" << endl; } //确切的查找某个键值对 if (dict.find(1) != dict.end()) { iter = dict.find(1); cout << iter->second << endl; } else { cout << "不存在这玩意" << endl; } }

set

set底层基于红黑树,所以自带排序功能,插入进来的数字,不管何时都是自动排序的,并且自带去重功能

int main() { set<int> s1; set<int>::iterator iter1; s1.insert(5); s1.insert(5); s1.insert(4); s1.insert(4); s1.insert(3); s1.insert(2); s1.insert(1); for (iter1 = s1.begin(); iter1 != s1.end(); iter1++) { cout << *iter1 << "\n" << endl; } }

unordered_set

底层基于hash表,所以插入删除的速度都是相当快的,但是存储进来是无序的,无法做到有序存储,也拥有去重功能。

int main() { unordered_set<int> s2; unordered_set<int> iter2; s2.insert(1); s2.insert(90); s2.insert(76); s2.insert(7); s2.insert(11); s2.insert(8); s2.insert(99); //一种船新的遍历方法 for (const auto &tmp : s2) { cout << tmp << "\n" << endl; } }

Stack

一些常用操作 s.empty() 如果栈为空返回true,否则返回false s.size() 返回栈中元素的个数 s.pop() 删除栈顶元素但不返回其值 s.top() 返回栈顶的元素,但不删除该元素 s.push() 在栈顶压入新元素

Demo演示

#include <iostream> #include <vector> #include <queue> #include <stack> using namespace std; int main() { stack<int> stack; cout<<stack.empty()<<"\n";//1代表true stack.push(1); stack.push(2); stack.push(3); stack.push(4); stack.push(5); cout<<stack.top()<<"\n";//5 stack.pop();//删除栈顶元素 cout<<stack.top()<<"\n";//4 cout<<stack.size()<<"\n";//4 cout<<stack.empty()<<"\n";//0代表false }

Queue

一些常用操作 q.empty() 如果队列为空返回true,否则返回false q.size() 返回队列中元素的个数 q.pop() 删除队列首元素但不返回其值 q.front() 返回队首元素的值,但不删除该元素 q.push() 在队尾压入新元素 q.back() 返回队列尾元素的值,但不删除该元素

#include <iostream> #include <vector> #include <queue> #include <stack> using namespace std; int main() { queue<int> q; q.push(1); q.push(2); q.push(3); q.push(4); q.push(5); cout << q.front() << "\n";//打印队首元素 1 cout << q.back() << "\n"; //打印队尾元素 5 q.pop();//抛出队列首部元素 cout << q.front() << "\n";// 2 cout << q.back() << "\n"; // 5 }

一些常用的库Demo

next_permutation/prev_permutation

打印一个数组下一个字典序的排序(prev_permutation同理)

int main() { int a[] = {1,2,3,4}; sort(a,a+4); while(next_permutation(a,a+4)){ for (int i = 0; i < sizeof(a)/sizeof(a[0]); i++) { cout<<a[i]; } cout<<"\n"; } } 1243 1324 1342 1423 1432 2134 2143 2314 2341 2413 2431 3124 3142 3214 3241 3412 3421 4123 4132 4213 4231 4312 4321

count

int main() { //count函数的用法 vector<int> v(10); int a[10] = { 1, 2, 3, 4, 4, 4, 4 }; v[0] = 1; v[1] = 1; v[2] = 1; v[3] = 1; v[4] = 1; v[5] = 1; v[6] = 6; v[7] = 7; v[8] = 8; v[9] = 9; //向量计数 cout << count(v.begin(), v.end(), 1) << endl; cout << count(v.begin(), v.end(), 5) << endl; cout << count(v.begin(), v.end(), 6) << endl; cout << endl; //数组计数 cout << count(a, a + 10, 0) << endl; cout << count(a, a + 10, 1) << endl; cout << count(a, a + 10, 4) << endl; system("pause"); return 0; }

sort

vector排序

int main() { vector<int> v1; v1.push_back(2); v1.push_back(3); v1.push_back(1); sort(v1.begin(),v1.end()); for (int i = 0; i < v1.size(); i++) { cout<<v1[i]; } } 123

数组排序

int main() { int nums[] = {3,2,1}; sort(nums,nums+3); for (int i = 0; i < sizeof(nums)/sizeof(nums[0]); i++) { cout<<nums[i]; } } 123

lower_bound/upper_bound

查找数组中第一个大于等于或者大于x的数字下标 lower_bound(a,a+a.size(),x) upper_bound同理

int main() { int nums[] = {1,2,3,4,5,6,7}; cout<<upper_bound(nums,nums+sizeof(nums)/sizeof(nums[0]),3)-nums; } //3

Find

查找,这个在数组中或者vector中都会用到。 基本使用方法就是find(起始迭代器,终点迭代器,查找内容) 然后写两个demo

在字符串中的查找

int main() { find函数返回类型 size_type string s("1a2b3c4d5e6f7jkg8h9i1a2b3c4d5e6f7g8ha9i"); string flag; string::size_type position; //find 函数 返回jk 在s 中的下标位置 position = s.find("jk"); if (position != s.npos) //如果没找到,返回一个特别的标志c++中用npos表示,我这里npos取值是4294967295, { printf("position is : %ld\n", position); } else { printf("Not found the flag\n"); } }

在vector中的查找

int main() { vector<int>v1; v1.push_back(2); v1.push_back(1); v1.push_back(0); v1.push_back(11); v1.push_back(199); vector<int>::iterator iter = find(v1.begin(),v1.end(),0); if (iter!=v1.end()) { //获取下标 cout<<iter-v1.begin()<<endl; } return 0; }

其他

求某个数字中二进制的1的个数

int main() { cout<<__builtin_popcount(101); } //4
最新回复(0)