set+ vector的详解及用法

来源:互联网 发布:c语言多进程编程实例 编辑:程序博客网 时间:2024/06/03 23:01

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




原创粉丝点击