STL:vector,list,set容器代码 关于reverse_iterator

STL:vector容器

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>//算法
#include<iterator>
using namespace std;
int main()
{
    vector <string>sentence;
    sentence.reserve(10);//预留:确保vector中还剩5个内存,可不要,此时capacity为10
    sentence.push_back("hello,");//在vector向量最后加上
    sentence.push_back("how");
    sentence.push_back("are");
    sentence.push_back("you");
    sentence.push_back("?");
    int a=sentence.empty();
    cout<<a<<endl;
    for(int i=0;i<sentence.size();i++)
        cout<<sentence[i]<<" ";
        cout<<endl;
    vector<string>::iterator it;//定义迭代器(相当于指针)
    for(it=sentence.begin();it!=sentence.end();it++)
        cout<<*it<<" ";
        cout<<endl;
    copy(sentence.begin(),sentence.end(),ostream_iterator<string>(cout," "));//copy用法
        cout<<endl;
   // copy(sentence.begin(),sentence.end(),screen);//copy用法二??
       // cout<<endl;
    cout<<"max_size="<<sentence.max_size()<<endl;//返回容器能容纳的最大元素
    cout<<"size="<<sentence.size()<<endl;//返回当前元素个数
    cout<<"capacity="<<sentence.capacity()<<endl;//capacity:在当前分配的内存即realloc之前能容纳的元素个数
    swap(sentence[1],sentence[3]);//交换字符串
     for(int i=0;i<sentence.size();i++)
        cout<<sentence[i]<<" ";
        cout<<endl;
    sentence.insert(find(sentence.begin(),sentence.end(),"?"),"always");
    sentence.back()="!";//back()函数是返回当前容器中末尾元素的引用
    for(int i=0;i<sentence.size();i++)
        cout<<sentence[i]<<" ";
        cout<<endl;
        system("pause");//按任意键继续
        return 0;

}

vector定义二维数组

  vector <vector <int>     >   array2(3);      // 注意> 和> 之间的空格。 
  array2可以保存3个向量,向量的长度是可以改变的。array2[i]返回的是第i个向量。同理,array2[i][j]返回的是第i个向量中的第j个元素。 
      vector <vector <int>     >   array2(3); 
          array2[1][2]=9; //错误,程序会segement   failed,原因就是你没有指定向量的大小。
用push_back函数可以解决问题:array2[1].push_back(9)
      或      for(int   i=0;i <3;i++) 
                  array2[i].resize(3); 
    这样,你就定义了一个3X3的数组了(另一个3在   申明时定义的)。而且你可以随时改变它的大小。 

vector<vector<int> > array(m); //这个m一定不能少,不然就是 调用默认构造函数为0
//初始化一个m*n的二维数组
for(int i=0;i<m;i++) {
    array[i].resize(n);

2.遍历 
(1)利用迭代器

void reverse_with_iterator(vector<vector<int>> vec)
{
    if (vec.empty())
    {
        cout << "The vector is empty!" << endl;
        return;
    }

    vector<int>::iterator it;
    vector<vector<int>>::iterator iter;
    vector<int> vec_tmp;

    cout << "Use iterator : " << endl;
    for(iter = vec.begin(); iter != vec.end(); iter++)
    { vec_tmp = *iter;        for(it = vec_tmp.begin(); it != vec_tmp.end(); it++)
            cout << *it << " ";
        cout << endl;
    }
}

(2)得到行、列大小,利用下标进行遍历
void reverse_with_index(vector<vector<int>> vec)
{
    if (vec.empty())
    {
        cout << "The vector is empty!" << endl;
        return;
    }

    int i,j;
    cout << "Use index : " << endl;
    for (i = 0; i < vec.size(); i++)
    {
        for(j = 0; j < vec[0].size(); j++)
            cout << vec[i][j] << " ";
        cout << endl;
    }
}

STL:list容器

//示例STL的使用
#include <iostream>
#include <list>//包含双向链表容器头文件
#include <iterator>//迭代器头文件,可以省略
#include<algorithm> //STL算法
using namespace std;
int main()
{
	list< int >List;
	int Value=0,Option=0;
   	do{
		cout<<endl
			<<"        双向链表菜单"<<endl
			<<" 1. 在链表首部插入一个结点 "<<endl
			<<" 2. 在链表尾部插入一个结点 "<<endl
			<<" 3. 从链表首部删除一个结点 "<<endl
			<<" 4. 从链表尾部删除一个结点 "<<endl
			<<" 5. 从链表首部开始输出结点内容 "<<endl
			<<" 6. 从链表尾部开始输出结点内容 "<<endl
			<<" 0. 退出 "<<endl
			<<"输出选择:";
		cin>>Option;
		switch(Option)
		{
		case 1:
			{//可不要
			cout<<"输入结点数据:";
			cin>>Value;
			List.insert(List.begin(),Value);
			cout<<"结点"<<Value<<"成功插入。"<<endl;
			break;
			}
        case 2:
			{
			cout<<"输入结点数据:";
			cin>>Value;
			List.insert(List.end(),Value);
            cout<<"结点"<<Value<<"成功插入。"<<endl;
			break;
			}
        case 3:
			{
			if(List.begin()==List.end())
				cout<<endl<<"没有链表,不能进行删除。";
			else
				{
				List.erase(List.begin()) ;
                cout<<endl<<"结点删除成功。"<<endl;
			    }
                break;
            }
		case 4:
			{
				if (List.begin()==List.end())
                	cout<<endl<<"没有链表,不能进行删除。";
			    else
                {
				List.erase(List.end());
                cout<<endl<<"结点删除成功。"<<endl;
                }
			    break;
			}
		case 5:
			{
		    list<int>::const_iterator p1;//p1是整型双向链表的迭代子
            if(List.begin()==List.end())
                cout<<endl<<"没有链表,没有结点输出。";
			else
			{
		    cout<<"从首部开始输出链表:"<<endl;
	        for(p1=List.begin();p1!=List.end();p1++)
		    cout<<*p1<<" ";   // 依次输出链表中所有元素
	        cout<<endl;
			}
			break;
			}
		case 6:
			{
			list<int>::reverse_iterator p2;//p2是整型双向链表的迭代子
			if (List.rbegin()==List.rend())
                cout<<endl<<"没有链表,没有结点输出。";
			else
			{
				p2=List.rbegin();//反向迭代指向最后一个元素
                cout<<"从尾部开始输出链表::"<<endl;
	            while(p2!=List.rend())//当反向迭代不指向第一个元素时
				{
		        cout<<*p2<<" ";   // 逆向输出链表中所有元素:
		        p2++;
				}
			}
	        cout<<endl;
 			break;
			}
		}
     }while(Option!=0);
	 return 0;
}

关于reverse_iterator


对于left_null>1->2->3->4->right_null,这样一个有4个元素(1,2,3,4)的链表.

1->2->3->4->尾
list<int>iteraotr c1=intList.begin()      // *c1=1;
list<int>iteraotr c2=intList.end()         // *c2=right_null;

尾<-1<-2<-3<-4
iterator++,
则对于上边正向链表从左向右遍历
for(c1=.begin(),c1!=.end();c1++)
       cout<<...1,2,3,4

list<int>reverse_iteraotr c1=intList.rbegin()      // *c1=4;   rbegin:相当于reverse_begin即反着看的头
list<int>reverse_iteraotr c1=intList.rend()         // *c1=left_null; rend相当于reverse_end即反着看的尾

reverse_iterator++,则对于上边正向链表从右向左遍历.
for(c2=.rbegin();r2!=.rend();
c2++)
相当于:4 3 2 1


而begin()指向第一个结点,end()指向最后一个结点之后

set容器的创建

#include <iostream>
#include <set>
#include <functional>
using namespace std;
set<int> s;

int main(){
   set<int > seta; //默认是小于比较器less<int>的set

   set<int, greater<int> > setb; //创建一个带大于比较器的set,需包含头文件functional

   int a[5] = {1,2,3,4,5};
   set<int > setc(a,a+5); //数组a初始化一个set;

   set<int > setd(setc.begin(),setc.end()); //setc初始化一个set
   //上述两例均为区间初始化

   set<int > sete(setd); //拷贝构造创建set
   return 0;
}


3.set容器的增删改查

①插入

#include <iostream>
#include <set>
using namespace std;
set<int >s;
void setprint(int cnt){
    cout << "Test output :" << cnt << ":" << endl;
    for(set<int>::iterator it = s.begin(); it!= s.end(); it++)
        cout << *it << " ";
    puts("");
    return ;
}
int main(){
    int cnt = 1;
    s.insert(1);
    s.insert(2);
    s.insert(5);
    setprint(cnt++);

    s.insert(2); //set只允许用一个值出现一次,要插入相同元素请用multiset
    setprint(cnt++);

    int a[4] = {11,12,13,14};
    s.insert(a,a+4); //将区间[a, a+4]里的元素插入容器
    setprint(cnt++);

    return 0;
}
  • 插入

②删除

s.erase()       删除一个元素

s.clear()       删除set容器中的所有的元素

#include <iostream>
#include <set>
using namespace std;
set<int >s;
void setprint(int cnt){
    cout << "Test output :" << cnt << ":" << endl;
    for(set<int>::iterator it = s.begin(); it!= s.end(); it++)
        cout << *it << " ";
    puts("");
    return ;
}

int main(){
    int cnt = 1;
    for(int i = 1; i < 11; i++){
        s.insert(i);
    }
    setprint(cnt++);

    s.erase(9); //根据元素删除
    setprint(cnt++);

    set<int>::iterator ita = s.begin();
    set<int>::iterator itb = s.begin();
    s.erase(ita);  //删除迭代器指向位置的元素
    setprint(cnt++);

    ita = s.begin();
    itb = s.begin();
    itb++;itb++;
    s.erase(ita,itb); //删除区间[ita,itb)的元素
    setprint(cnt);
    s.clear();
    return 0;
}
  • 删除

③修改

不能直接修改容器内数据,所以只能删除某元素再插入要修改的数值。
  • 1
  • 2

④查找

s.find()        查找一个元素,如果容器中不存在该元素,返回值等于s.end()
  • 1
  • 2
#include <iostream>
#include <set>
using namespace std;
set<int >s;
void setprint(int cnt){
    cout << "Test output :" << cnt << ":" << endl;
    for(set<int>::iterator it = s.begin(); it!= s.end(); it++)
        cout << *it << " ";
    puts("");
    return ;
}
int main(){
    int cnt = 1;
    s.insert(1);
    s.insert(2);
    s.insert(5);
    setprint(cnt++);

    if(s.find(2) != s.end()) 
        cout << "2 is existent" << endl;
    else 
        cout << "2 is non-existent" << endl;
    if(s.find(3) == s.end()) 
        cout << "3 is non-existent" << endl;
    else 
        cout << "2 is existent" << endl;
    return 0;
}

  • 自定义比较函数

以上就是刷题必备的set用法,熟练掌握,要用时别用错就成。

至于求并、交、差、对称差等操作,暂不细说,使用时要包含头文件”algorithm”。 
此外还有unordered_set和unordered_multiset,为set和multiset的无序版,使用时要包含头文件”unordered_set”。

猜你喜欢

转载自blog.csdn.net/wangqianqianya/article/details/79823915