去重
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; }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和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底层基于红黑树,所以自带排序功能,插入进来的数字,不管何时都是自动排序的,并且自带去重功能
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; } }底层基于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; } }一些常用操作 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 }一些常用操作 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 }打印一个数组下一个字典序的排序(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 4321vector排序
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查找数组中第一个大于等于或者大于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查找,这个在数组中或者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