先看如何删除指定数值
代码如下:
for(int i=0; i<vec.size(); ++i) { if(vec.at(i) == 2) { vec.erase(vec.begin()+i); i--; //由于删除当前的值后,后一位的值会自动补上来,故需要i-1,否者在++i之后,会跳过被删除值的下一个值 } }
下面结合map使用,来删除一个数组中重复次数大于n的值
先介绍下map:
map的特性是,所有元素都会根据元素的键值自动被排序。map的所有元素都是pair,同时拥有实值(value)和键值(key)。pair的第一个元素会被视为键值,第二个元素会被视为实值。map不允许两个元素拥有相同的键值。
下面看一下<stl_pair.h>中的pair定义:
template <class T1, class T2> struct pair{ typedef T1 first_type; typedef T2 second_type; T1 first;//注意,它是public T2 second;//注意,它是public pair() : first(T1()),second(T2()) {} pair(const T1&a,const T2&b) :first(a),second(b) {} };
对map进行元素新增操作(insert)和删除(erase)时,操作之前的所有迭代器,在操作完成之后依然有效。被删除的迭代器除外。
标准的STL map是以红黑树为底层机制完成的,每一个节点的内容是一个pair。
一、map的基本构造函数
map<string , int >strMap; map<int ,string >intMap; map<string, char>strMap; map<char ,string>charMap; map<char ,int>charMap; map<int ,char >intMap;
二、map添加数据
map<int ,string> maplive;
1.pair<int,string> value(1,"a");maplive.insert(value); 等价于maplive.insert(pair<int,string>(1,"a")); 2. maplive.insert(map<int,string>::value_type(1,"a")); 3. maplive[1]="a";//map中最简单最常用的插入添加!
三、map的基本操作函数:
begin() 返回指向map头部的迭代器 clear() 删除所有元素 count() 返回指定元素出现的次数 empty() 如果map为空则返回true end() 返回指向map末尾的迭代器 equal_range() 返回特殊条目的迭代器对 erase() 删除一个元素 find() 查找一个元素 get_allocator() 返回map的配置器 insert() 插入元素 key_comp() 返回比较元素key的函数 lower_bound() 返回键值>=给定元素的第一个位置 max_size() 返回可以容纳的最大元素个数 rbegin() 返回一个指向map尾部的逆向迭代器 rend() 返回一个指向map头部的逆向迭代器 size() 返回map中元素的个数 swap() 交换两个map upper_bound() 返回键值>给定元素的第一个位置 value_comp() 返回比较元素value的函数
来删除一个数组中重复次数大于n的值,代码如下
#include <iostream> #include <cstring> #include <vector> #include <map> using namespace std; int main(){ int n, times;//n为输入n个数,times为限定次数 cin >> n >> times; vector<int> vec; for(int i=0; i<n; ++i) { int tmp; cin >> tmp; vec.push_back(tmp); } map<int, int> mapT; for(int i=0; i<vec.size(); ++i) { if(mapT.end() != mapT.find(vec.at(i))) mapT[vec.at(i)]++; else { mapT[vec.at(i)] = 1; } } auto iter = mapT.begin(); for(; iter != mapT.end();++iter) cout << "key=" << iter->first << " value=" << iter->second << endl; for(int i=0; i<vec.size(); ++i) { if(mapT.find(vec.at(i))->second >= times) { vec.erase(vec.begin()+i); i--; } } for(int i=0; i<vec.size(); ++i) { cout << vec.at(i) << ' '; } cout << endl; // map<int, int> mapT; // mapT.insert(pair<int,int>(2,5)); // mapT[3] = 5; // mapT[3]++; // auto iter = mapT.begin(); // for(; iter != mapT.end();++iter) // cout << "key=" << iter->first << "value=" << iter->second << endl; system("pause"); return 0; }
运行结果: