set+ vector的详解及用法


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的定位器


三.自定义比较函数
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命名域的,因此需要通过命名限定,可以在文件开头加上

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
//对于容器使用迭代器操作容器中对应位置的值
//当迭代器指向了容器中的某位置,则可以使用 *加迭代器操作该位置了
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的用法仅供入门只用 许多看多练习


#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<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;
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章