STL之vector(2)

vector区别于array,vector是动态数组。主要记录其基本操作、定义、初始化、二维vector


  • 头文件: #include<vector>
  • 定义和初始化:
vector v1; // 创建空容器,其对象类型为string类
vector v2(10); //创建有10个具有初始值(即空串)的string类对象的容器
vector v3(5, "hello")//创建有5个值为“hello”的string类对象的容器
vector v4(v3.begin(), v3.end());//v4是与v3相同的容器(完全复制)
  • 基本操作:
v.push_back(i)// 在数组的最后添加一个值为i的数据
v.size() //当前使用数据的大小
v[i] //返回v中位置为n的元素,和数组一样
v.erase(it);//删除元素
v.insert(it+y,x)//添加元素,x是元素,it+y是地址
v.empty()//判断vector是否为空
v1=v2 //把v1的元素替换为v2元素的副本
v1==v2//判断v1与v2是否相等
!=、<、<=、>、>= //保持这些操作符惯有含义
v.pop_back()// 移除最后一个元素
v. clear() //清空所有元素
  • 迭代器:
    it地址和*it元素
vector::iterator it;//最好定义在外面
for(it=v1.begin();it!=v1.end();it++) {cout<<*it<<endl;}
//如:v1.erase(it);先删除后添加v1.insert(it+y,x);
  • vector的insert()参数讲解
#include<bits/stdc++.h>
using namespace std;
/*
当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的.
vector中insert()的用法详解
*/
int main()
{
    //创建一个vector,置入字母表的前4个字符 
    vector <char> letter; 
    for( int i=0; i < 4; i++ ) 
      letter.push_back( i + 65 ); 
    /*
----------
    1.insert( iterator loc, size_type num, const TYPE &val)
----------
    在指定位置loc前插入num个值为val的元素 
    插入2个C到vector中 
    输出是:CCABCD 
    */
    vector <char>::iterator it1 = letter.begin(); 
    letter.insert( it1, 2, 'C'); 
    for( it1 = letter.begin(); it1 != letter.end(); it1++ ) cout<<*it1; 
    cout<<endl;
    /*
----------
    2.iterator insert( iterator loc, const TYPE &val ); 
----------
    在指定位置loc前插入值为val的元素,返回指向这个元素的迭代器
    输出是:CCABCDH
    */ 
    vector <char>::iterator it2 = letter.end()-1; 
    letter.insert( it2+1,'H'); 
    for( it2 = letter.begin(); it2 != letter.end(); it2++ ) cout<<*it2; 
    cout<<endl;
    /*
----------
    3.void insert( iterator loc, input_iterator start, input_iterator end ); 
----------
    在指定位置loc前插入区间[start, end)的所有元素 
    输出是:CBCDCABCDH
    */
    vector <char>::iterator it3 = letter.begin(); 
    letter.insert( it3+1,it3+3,it3+6); 
    for( it3 = letter.begin(); it3 != letter.end(); it3++ ) cout<<*it3; 
    return 0;
}
  • vector之二维vector
#include<bits/stdc++.h>
using namespace std;
int main()
{
    /*
    int N=5,M=3 
    1.vector创建一个二维数组总是: 
    vector<vector<int>> array(N);
    for (int i = 0; i < array.size(); i++)
    array[i].resize(M);
    2.方法2 
    N行,每行M个元素(一维数组),元素初始化=0 
    vector<vector<int> > array(N, vector<int>(M,0));
    3.二维vector的遍历 
      需要定义的迭代器:
      二维:vector<vector<int>>::iterator iter;
      一维:vector<int>::iterator it;
      还需要定义一个一维vector 来存储每一行
       vector<int> vec_tmp;
    4.基于3的输出:
      for(iter = array.begin(); iter != array.end(); iter++)
     {
        vec_tmp = *iter;
        for(it = vec_tmp.begin(); it !=vec_tmp.end(); it++)
            cout << *it << " ";
        cout << endl;
     }
     5.实现对二维的初始化:
     for(i = 0; i < array.size(); i++)
    {
        for (j = 0; j < array[0].size();j++)
        {
            array[i][j] = (i+1)*(j+1);
        }
    } 
    */

    vector<vector<int> > array(5, vector<int>(3,0));//二维数组,5行3列 
    vector<int>::iterator it;//一维迭代器 
    vector<vector<int> >::iterator iter;//二维迭代器 
    vector<int> vec_tmp;//一维数组 
    for(iter=array.begin();iter!=array.end();iter++)
    {
        vec_tmp = *iter;
        for(it = vec_tmp.begin();it !=vec_tmp.end();it++)
            cout << *it << " ";
        cout << endl;
    }
}
  • 结构体vector

题目:输入的n个人的名字,年龄。根据年龄进行升序排
知识点:
1. 运算符重载
2. vector+结构体(结构体数组)
3. sort()函数操作

#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define Max 10000 //Max取无穷大     
//S结构体的别名 
 struct S{
    string name;
    int age;
    //运算符重载 
    /*
       重载1:从大到小的降序排序
       bool operator<(const S &other)const{
         if(age<other.age)return false;
       return true;  
       } 
    */
    //重载2:从小到大的升序排序 
    bool operator<(const S &other)const{
     if(age<other.age)return true;
       return false;  
    }         
 };
vector <S>::iterator it;
int main()
{
    int n;
    cin>>n;
    vector <S> stu(n);//定义一个结构体数组 ,并且必须定义vector的大小 
    //先初始化了大小 可以用这种方法
    for(it=stu.begin();it!=stu.end();it++)
    {
      cin>>(*it).name>>(*it).age;
    }
    //需求1.实现年龄的从小到大排序的输出 
    //不可以直接sort函数:sort(stu.begin(),stu.end());编译错误
    //必须重载运算符后,再添加sort函数 
    sort(stu.begin(),stu.end()); 
    //输出显示 
    //默认的输出:类似队列 先进先出 
    for(it=stu.begin();it!=stu.end();it++)
    {
     cout<<(*it).name<<":"<<(*it).age<<endl;
    }
    return 0;
}
  • 结构体vector的另一种输入方式
#include<bits/stdc++.h>
using namespace std; 
 struct S{
  string name;
  int age;
 };
int main()
{
    int n;
    cin>>n;
    vector <S> stu;
    for(int i=0;i<n;i++)
    {
        string name;
        int age;
        //输入方式
        cin>>name>>age;
        S s={name,age};
        stu.push_back(s);
    }         
    for (int i=0;i<n;i++)
    {
      cout<<stu[i].name<<":"<<stu[i].age<<endl;
    }
}
  • 当struct换成class(类)时,元素的写入方式:
//当时struct的时候 
/*
    struct S{
     string name;
     int age;
    };
    S s={name,age};
    stu.push_back(s);
*/


----------


//当时class的时候 
/*
    class S{
       public:
        string name;
        int age;
      S(string _name,int _age):name(_name),age(_age){}
    };
    stu.push_back(S(name,age));
*/

猜你喜欢

转载自blog.csdn.net/zhaoshuling1109/article/details/80487636
今日推荐