Set 的用法总结:
//======================
/*C++STL之set的基本操作
//2015-04-1321:05 by itwolf, 1943 阅读, 0 评论, 收藏, 编辑
set是集合,虽然也存在键值和实值,不过两者根本就是同一个值,键值的设置完全就是为了满足红黑树的底层结构,set操作与map很像不过也有些不同。
1、set迭代器与map的不同:
(1)set使用接引用运算符*取值,而map使用first和second取值。
(2)set的迭代器都是常量迭代器,不能用来修改所指向的元素,而map的迭代器是可以修改所指向元素的。
2、set没有重载[]运算符,而map中重载了,因为直接使用[]改变元素值会打乱原本正确的顺序,要改变元素值必须先删除旧元素,则插入新元素
3、构造的类型不一样,如同样实值为int类型分别为set<int>和map<type,int>(其中type可以为任意类型)
其他如插入、删除、查找等操作与map几乎一样
*/
#include<iostream>
#include<set>
using namespace std;
voidprint(set<int>set_int)
{
set<int>::iteratorit=set_int.begin();
for(;it!=set_int.end();it++)
cout<<*it<<" "; //循环输出 set容器里面的元素是被排好序之后进行的输出!!!!!重要!!!!
cout<<endl;
}
int main()
{
intnum[4]={1,2,3,4};
set<int>set_int(num,num+4);
set_int.insert(5); //代表了插入一个元素 并且输出set集合里面的值
2,在pos位置之前插入value,返回新元素位置,但不一定能插入成功
//iterator insert(&pos, value)
print(set_int);
set_int.insert(5);
print(set_int);
//元素删除
set_int.erase(3);//1. 移除set容器中的所有为3的元素值 并返回元素的个数
//2.voiderase(&pos) //移除pos位置上的元素 无返回值
//3.void erase(&first,&last) 移除迭代区间【&first,last)内的元素无返回值
//4.void clear(); 移除set容器中的所有元素
print(set_int);
//元素查找
//count(value)返回set对象内元素之为value的元素个数
//iterator find(value)返回value所在位置,找不到value将返回end();
//lower_bound(value)表示返回大于等于value的第一个元素的下标 upper_bound(value),qual_range(value);
int a[5]={8,4,5,5,5}; // 当你的数组中有重复的元素时放入set容器输出直接将重复的删除
set<int>v4(a,a+5);
print(v4);
//--------------以下查找函数 返回的值的下标是不对的!!!!!!!! 建议先不使用该函数-------------
set<int>::iteratorit;
it=v4.find(5); //it为5所在下标的位置
cout<<*it<<endl; //因为it是一个迭代器(指针) 所以需要加一个 * 表示该指针指向变量的值
set<int>::iteratorq;
q=set_int.find(2); //搞不懂输出的是麻子
cout<<*q<<endl;
q=set_int.find(8); // 同上
cout<<*q<<endl;
//------------- 截至到以上是查找函数 ------------
return0;
}
以下给予的是C++stl容器set成员函数:
begin()--返回指向第一个元素的迭代器
clear()--清除所有元素
count()--返回某个值元素的个数
empty()--如果集合为空,返回true
end()--返回指向最后一个元素的迭代器
equal_range()--返回集合中与给定值相等的上下限的两个迭代器
erase()--删除集合中的元素
find()--返回一个指向被查找到元素的迭代器
get_allocator()--返回集合的分配器
insert()--在集合中插入元素
lower_bound()--返回指向大于(或等于)某值的第一个元素的迭代器
key_comp()--返回一个用于元素间值比较的函数
max_size()--返回集合能容纳的元素的最大限值
rbegin()--返回指向集合中最后一个元素的反向迭代器
rend()--返回指向集合中第一个元素的反向迭代器
size()--集合中元素的数目
swap()--交换两个集合变量
upper_bound()--返回大于某个值元素的迭代器
value_comp()--返回一个用于比较元素间的值的函数
lower_bound(key_value)?,返回第一个大于等于key_value的定位器
upper_bound(key_value),返回最后一个大于等于key_value的定位器
begin()--返回指向第一个元素的迭代器
clear()--清除所有元素
count()--返回某个值元素的个数
empty()--如果集合为空,返回true
end()--返回指向最后一个元素的迭代器
equal_range()--返回集合中与给定值相等的上下限的两个迭代器
erase()--删除集合中的元素
find()--返回一个指向被查找到元素的迭代器
get_allocator()--返回集合的分配器
insert()--在集合中插入元素
lower_bound()--返回指向大于(或等于)某值的第一个元素的迭代器
key_comp()--返回一个用于元素间值比较的函数
max_size()--返回集合能容纳的元素的最大限值
rbegin()--返回指向集合中最后一个元素的反向迭代器
rend()--返回指向集合中第一个元素的反向迭代器
size()--集合中元素的数目
swap()--交换两个集合变量
upper_bound()--返回大于某个值元素的迭代器
value_comp()--返回一个用于比较元素间的值的函数
lower_bound(key_value)?,返回第一个大于等于key_value的定位器
upper_bound(key_value),返回最后一个大于等于key_value的定位器
三.自定义比较函数
1.元素不是是结构体
struct myComp
{
bool operator()(const your_type&a,const your_type &b)
[
return a.data-b.data>0;
}
}
set<int,myComp>s;
......
set<int,myComp>::iterator it;
如果元素是结构体,可以直接将比较函数写在结构体内
struct Info
{
string name;
float score;
//重载“<”操作符,自定义排序规则
bool operator < (const Info&a) const
{
//按score从大到小排列
return a.score<score;
}
}
set<Info> s;
......
set<Info>::iterator it;
Vector 的用法总结:
1.元素不是是结构体
struct myComp
{
bool operator()(const your_type&a,const your_type &b)
[
return a.data-b.data>0;
}
}
set<int,myComp>s;
......
set<int,myComp>::iterator it;
如果元素是结构体,可以直接将比较函数写在结构体内
struct Info
{
string name;
float score;
//重载“<”操作符,自定义排序规则
bool operator < (const Info&a) const
{
//按score从大到小排列
return a.score<score;
}
}
set<Info> s;
......
set<Info>::iterator it;
Vector 的用法总结:
#include<iostream>
using namespace std;
#include<vector>
#include<string>
#include<algorithm>
int main()
{
stringstr[]={"Alex","John","Robert"};
vector<int> v1;// 创建一个空vector容器
vector<int> v2(10); //创建一个有10个空元素的vector容器
vector<int> v3(10,0); //创建一个有10个元素的vector容器,并赋值为0;
vector<string> v4(str,str+3); //根据字符串数组创建vector容器
vector<string>::iterator e = v4.begin(); //迭代器法遍历
while(e!=v4.end())
{
cout<<*e++<<"";
}
cout<<endl;
vector<string> v5(v4); //拷贝构造
for(int i=0;i<3;i++) //下标遍历
cout<<v5[i]<<"";
cout<<endl;
return0;
}
[STL]vector基本用法
vector的数据安排以及操作方式,与array非常相似。两者的唯一区别在于空间的运用的灵活性。array是静态空间,一旦配置了就不能改变。vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素。因此,vector的运用对于内存的合理利用与运用的灵活性有很大的帮助,我们再也不必因为害怕空间不足而一开始要求一个大块的array。
vector动态增加大小,并不是在原空间之后持续新空间(因为无法保证原空间之后尚有可供配置的空间),而是以原大小的两倍另外配置一块较大的空间,然后将原内容拷贝过来,然后才开始在原内容之后构造新元素,并释放原空间。因此,对vector的任何操作,一旦引起空间重新配置,指向原vector的所有迭代器就都失效了。
int main()
{
inti=0;
for(;i<25;i++) //向容器中填充数据
{
v4.push_back(1);
}
v4.resize(400); // 将容器的大小改为400 可以存放400个数据
class act //定义一个存放class的容器
{
};
vector<act>v4;
vector<int> v4(100,0) //定义100个int型数据并都给赋值为0
vector<int> v4(100,0); //将v4的内容全部赋值给v3;
vector<int>v3(v4);
#include<vector> //头文件应该定义为
using std::vector或者using namespacestd或者不用定义,直接在使用vector的代码前使用std::加vector<int>v4; //vector属于std命名域的,因此需要通过命名限定,可以在文件开头加上
using std::vector或者using namespacestd或者不用定义,直接在使用vector的代码前使用std::加vector<int>v4; //vector属于std命名域的,因此需要通过命名限定,可以在文件开头加上
std::vector<int> v4;//定义一个vector
//以下为vector可以使用的功能
v4.clear() // 移除容器中所有数据。
v4.empty() //判断容器是否为空
v4.erase(pos) //删除pos位置的数据
v4.erase(beg,end) //删除【beg,end)区间的数据
v4.front() //传回第一个数据
v4.insert(pos,elem) //在pos位置插入一个elem拷贝
v4.pop_back() //删除最后一个数据
v4.push_back(elem) //在尾部加入一个数据
v4.resize(num) //改容器的大小
v4.size() //返回容器中实际数据的个数
v4.begin() //返回指向容器第一个元素的迭代器
v4.end() //返回指向容器最后一个元素的迭代器
下面介绍什么事迭代器
//迭代器相当于指针
int a=10;//对于变量而言 使用指针指向对应的变量
int *p; //以后就可以使用 * 加指针操作该变量了
p=&a;
//使用指针操作该变量
*p=11; //操作后a变为11
//对于容器使用迭代器操作容器中对应位置的值
//当迭代器指向了容器中的某位置,则可以使用 *加迭代器操作该位置了
//以下为vector可以使用的功能
v4.clear() // 移除容器中所有数据。
v4.empty() //判断容器是否为空
v4.erase(pos) //删除pos位置的数据
v4.erase(beg,end) //删除【beg,end)区间的数据
v4.front() //传回第一个数据
v4.insert(pos,elem) //在pos位置插入一个elem拷贝
v4.pop_back() //删除最后一个数据
v4.push_back(elem) //在尾部加入一个数据
v4.resize(num) //改容器的大小
v4.size() //返回容器中实际数据的个数
v4.begin() //返回指向容器第一个元素的迭代器
v4.end() //返回指向容器最后一个元素的迭代器
下面介绍什么事迭代器
//迭代器相当于指针
int a=10;//对于变量而言 使用指针指向对应的变量
int *p; //以后就可以使用 * 加指针操作该变量了
p=&a;
//使用指针操作该变量
*p=11; //操作后a变为11
//对于容器使用迭代器操作容器中对应位置的值
//当迭代器指向了容器中的某位置,则可以使用 *加迭代器操作该位置了
std::vector<int> v4; //定义一个vector
for(i=0;i<10;i++)
v4.push_back(j); //添加10个变量 填入值随变量j的变化而变化
std::vector<int>::iterator p; //定义一个迭代器 相当于定义一个指针
p=v4.begin(); //该(指针)迭代器指向容器的第一个元素
p++; // (指针) 迭代器移动至下一个元素(指向下一个元素)
*p=20; //修改指向该元素的值 意味着容器中第二个值被修改为20
p=v4.begin(); //循环扫描迭代器,改变所有值
for(;p!=v4.end();p++)
*p=50;
以上为vector的用法仅供入门只用 许多看多练习
for(i=0;i<10;i++)
v4.push_back(j); //添加10个变量 填入值随变量j的变化而变化
std::vector<int>::iterator p; //定义一个迭代器 相当于定义一个指针
p=v4.begin(); //该(指针)迭代器指向容器的第一个元素
p++; // (指针) 迭代器移动至下一个元素(指向下一个元素)
*p=20; //修改指向该元素的值 意味着容器中第二个值被修改为20
p=v4.begin(); //循环扫描迭代器,改变所有值
for(;p!=v4.end();p++)
*p=50;
以上为vector的用法仅供入门只用 许多看多练习
#include<iostream>
#include<string>
#include<vector>
using namespace std;
void main()
{
inti=0;
vector<int> v; //定义一个vector容器 v
for(i=0;i<10;i++)
v.push_back(i); // 元素放进vector中
for(i=0;i<v.size();i++)
cout<<v[i]<<" "; //输出每个元素
cout<<endl;
}
/// 你也可以用v.begin()与v.end()来得到vector开始的和结束的元素地址的指针位置
vector<int>::iteratoriter;
for(iter=v.begin();iter!=v.end();iter++)
cout<<*iter<<endl;
//对于二维vector的定义
定义一个10个vector元素,并对每个vector赋值1-10
#include<string>
#include<vector>
using namespace std;
void main()
{
inti=0;
vector<int> v; //定义一个vector容器 v
for(i=0;i<10;i++)
v.push_back(i); // 元素放进vector中
for(i=0;i<v.size();i++)
cout<<v[i]<<" "; //输出每个元素
cout<<endl;
}
/// 你也可以用v.begin()与v.end()来得到vector开始的和结束的元素地址的指针位置
vector<int>::iteratoriter;
for(iter=v.begin();iter!=v.end();iter++)
cout<<*iter<<endl;
//对于二维vector的定义
定义一个10个vector元素,并对每个vector赋值1-10
#include<iostream>
#include<string>
#include<vector>
using namespace std;
void main()
{
inti=0;
vector<int> v; //定义一个vector容器 v
for(i=0;i<10;i++)
v.push_back(i); // 元素放进vector中
for(i=0;i<v.size();i++)
cout<<v[i]<<" "; //输出每个元素
cout<<endl;
}
/// 你也可以用v.begin()与v.end()来得到vector开始的和结束的元素地址的指针位置
vector<int>::iteratoriter;
for(iter=v.begin();iter!=v.end();iter++)
cout<<*iter<<endl;
//对于二维vector的定义
定义一个10个vector元素,并对每个vector赋值1-10
#include<vector>
using namespace std;
void main()
{
inti=0,j=0;
vector<vector<int>>array(10,vetcor<int>(0)); //定义一个二维动态数组,有10行每一行使用一个vector储存这一行数据
//所以每一行的长度是可以变化的,之所以用到vector<int>(0)是对vector的初始化 否则不能对vector存入元素
for(j=0;j<10;j++)
for(i=0;i<9;i++)
{
array[j].push_back(i); //意思应该为对与array【i(相当于有几个vector元素)】同时一个vector含有10个元素
}
for(j=0;j<10;j++)
for(i=0;i<array[j].size();i++)
cout<<array[j][i]<<"";
cout<<endl;
}
// 定义一个行列都是变化的数组
#include<iostream>
#include<vector>
using namespace std;
int main()
{
inti=0,j=0;
vector<vector<int>>array;
vector<int>line;
for(j=0;j<10;j++)
{
array.push_back(line); //只有初始化之后才能存入元素
for(i=0;i<array[j].size();i++)
cout<<array[j][i]<<"";
}
cout<<endl;
}
#include<vector>
using namespace std;
int main()
{
vector<int>arr;
arr.push_back(6);
arr.push_back(8);
arr.push_back(3);
arr.push_back(8);
for(vector<int>::iteratorit=arr.begin();it!=arr.end();)
{
if(*it==8)
it=arr.erase(it); //删除当前为8的元素
else
++it; //不为8的化迭代器指向下一个地址
cout<<"AFTERremove 8:\n";
for(vector<int>::iteratorit=arr.begin();it<arr.end();++it)
cout<<*it<<"";
cout<<endl;
}
Upper_bound(p+1,p+1+n,n)(大于该元素的第一个元素的坐标) 找到的东西是n元素所在的下标 概念表示为(p+l)
要转换为该元素的下标应该减去 p+1 即为为该元素所在的下标
程序总结:
#include<iostream>
#include<set>
using namespace std;
void print(set<int>set_int)
{
set<int>::iterator it=set_int.begin();
for(;it!=set_int.end();it++)
cout<<*it<<" "; //循环输出 set容器里面的元素是被排好序之后进行的输出 !!!!!重要!!!!
cout<<endl;
}
int main()
{
int num[4]={1,2,3,4};
set<int>set_int(num,num+4);
set_int.insert(5); //代表了插入一个元素 并且输出set集合里面的值
2,在pos位置之前插入value,返回新元素位置,但不一定能插入成功
//iterator insert(&pos, value)
print(set_int);
set_int.insert(5);
print(set_int);
//元素删除
set_int.erase(3);//1. 移除set容器中的所有为3的元素值 并返回元素的个数
//2.void erase(&pos) //移除pos位置上的元素 无返回值
//3.void erase(&first,&last) 移除迭代区间【&first,last) 内的元素 无返回值
//4.void clear(); 移除set容器中的所有元素
print(set_int);
//元素查找
//count(value)返回set对象内元素之为value的元素个数
//iterator find(value)返回value所在位置,找不到value将返回end();
//lower_bound(value)表示返回大于等于value的第一个元素的下标 upper_bound(value), qual_range(value);
int a[5]={8,4,5,5,5}; // 当你的数组中有重复的元素时放入set容器输出 直接将重复的删除
set<int>v4(a,a+5);
print(v4);
//--------------以下查找函数 返回的值的下标 是不对的!!!!!!!! 建议先不使用该函数-------------
set<int>::iterator it;
it=v4.find(5); //it为5所在下标的位置
cout<<*it<<endl; //因为it是一个迭代器(指针) 所以需要加一个 * 表示该指针指向变量的值
set<int>::iterator q;
q=set_int.find(2); //搞不懂输出的是麻子
cout<<*q<<endl;
q=set_int.find(8); // 同上
cout<<*q<<endl;
//------------- 截至到以上是查找函数 ------------
return 0;
}