【c++】use vector

#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main(){
    //vector的定义和初始化
    cout << "\n定义和初始化vector:--------->" << endl;
    vector<int> v1;//定义一个空的vector,执行默认初始化
    vector<int> v2(v1);//定义一个拷贝v1的副本
            //指定数量的初始化
    vector<string> v3(3, "str");//定义一个初始含有3个“str”字符串的vector
    vector<int> v4(10);//定义初始含有10个默认初始化的vector(对于int,默认初始化全为0,对于string,全为空字符串)
            //用初始化列表进行初始化,注意是{ }而不是( ),前者用于列表初始化,后者用于提供构造信息,如v3和v4
    vector<int> v5{ 1, 2, 3, 4, 5 };//定义一个被自定义初始化的vector
    vector<int> v6 ={ 1, 2, 3 };//等价于v5

    //使用assign()为vector赋值(注意不是添加,而是覆盖)
    v1.assign(v5.begin(), v5.end() - 2);//将v5的开始到倒数第三个元素拷贝给v1
    v1.assign(4, 3);//使用4个3为v1赋值

    //使用back()获取vector的最后一个元素
    cout <<"\n使用back()获取vector的最后一个元素:"<< v1.back() << endl;

    //使用front()获取vector的第一个元素
    cout <<"\n使用front()获取vector的第一个元素:"<< v1.front() << endl;

    //使用insert()向vector中插入元素(是插入,不是覆盖,也不是替换,元素将后移)
    v1.insert(v1.begin(), 5);//在开始位置插入元素5
    v1.insert(v1.begin()+1, 3, 5);//在第一号开始插入3个5
    int arr[5] = { 1, 2, 3, 4, 5 };
    v1.insert(v1.begin(), arr + 1, arr + 3);//将数组b的第1和第2个元素插入到开始位置


    //使用push_back()添加元素到vector末尾,vector能高效管理内存,所以在定义时指定大小(v3,v4)是没有必要的。
    cout << "\n使用push_back()添加元素到vector末尾--------------->" << endl;
    int a;
            //cin返回为输入流,当输入流为无效(如需要int输入string时,vs测试是直接退出程序,无任何提示)
            //或输入文件结束符EOF(windows下为ctrl+z,类unix下为ctrl+d)结束
    //while (cin >> a){
    //  v1.push_back(a);
    //}
    v1 = { 1, 2, 4, 5, 6, 5 };


    //使用empty()判断vector是否为空
    cout << "\n判断vector是否为空----------------->" << endl;
    if (v1.empty()){
        cout << "v1 is empty!" << endl;
    }
    else{
        cout << "v1 is not empty!" << endl;
    }
    //使用size()返回vector元素个数
    cout << "\nnumber of v1 is:" << v1.size() << endl;
    //使用resize()来重新定义vector大小
    v1.resize(20);//原来元素多则删,少则补随机值
    v1.resize(20, 2);//原来元素多则删,少则补2

    //使用下标运算符[ ]访问指定位置的元素(返回元素的引用,故只要元素不是常量,就可以用下标来对元素进行赋值操作,
    //但下标不能用于添加新元素)
    cout << "\n使用下标[0]访问指定位置的元素--------------->" << endl;
    cout << v1[0] << endl;


    //使用=拷贝替换,也可以理解为赋值,整个vector全部替换,包括size等信息
    v2 = v5;
    cout << "\n使用=拷贝替换后的v2------------->" << endl;
    for (int i = 0; i < v2.size(); i++){
        cout << v2[i] << " ";
    }
    //使用列表{  }来拷贝替换
    v2 = { 2, 3, 4 };
    cout << "\n使用列表{  }来拷贝替换后的v2------------->" << endl;
    for (int i = 0; i < v2.size(); i++){
        cout << v2[i] << " ";
    }
    //使用==判断两vector相等,当且仅当对应元素都相等时为真
    //!=同理
    cout << "\n使用==判断两vector相等-------------->" << endl;
    if (v1 == v2){
        cout << "v1 = v2!" << endl;
    }
    else{
        cout << "v1 != v2!" << endl;
    }

    //使用关系运算符(>,<,>=,<=)判断两个vector大小
    //按字典顺序进行比较
    cout << "\n使用关系运算符判断两个vector大小---------->" << endl;
    if (v1 > v2){
        cout << "v1 > v2" << endl;
    }

    //使用范围for来访问vector中的元素
    cout << "\n使用范围for来访问vector中的元素----------->" << endl;
    for (auto &i : v2){ //i为元素的引用,这样可以通过i来修改v2的元素
        i *= i;
    }
    for (auto i : v2){ //只读,不能修改
        cout << i << " ";
    }

    //使用迭代器(与指针类似)
        //使用begin()返回表示第一个元素的迭代器
    cout << "\n使用begin()返回表示第一个元素的迭代器----------->" << endl;
    auto b = v1.begin();
    cout << *b << endl;
        //使用end()返回指向尾元素之后的位置的迭代器(尾后迭代器)
        //当vector为空时,begin()和end()都返回尾后迭代器
    cout << "\n使用end()返回指向尾元素之后的位置的迭代器----------->" << endl;
    auto e = v1.end();
    cout << *(e-1) << endl;//访问*e将会出错
        //迭代器运算
    cout <<"返回迭代器所指的元素的引用:"<< *b << endl;
    //iter->mem,返回iter所指的元素(类,结构体等)mem成员
    //cout << "返回上一个元素:" << *(--e) << endl;
    //cout << "返回下一个元素:" << *(++b) << endl;
    //==和!=分别用于判断两个迭代器是否相等
    //一个综合的例子:
    cout << "\n一个综合的例子:-------->" << endl;
    for (auto it = v1.begin(); it != v1.end(); it++){
        cout << *it << " ";
    }


    //迭代器类型,前面我们获取的迭代器类型都是用auto自动推算的,也可以手动添加
    cout << "\n定义读写义迭代器:------------>" << endl;
    for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++){
        cout << *it << " ";
        *it += 1;
    }
    //如果vector中的元素是一个常量,则只能使用const_iterator
    //若vector中元素是常量,则begin()和end()返回只读迭代器,
    //也可以使用cbegin()和cend()来返回非常量元素容器的只读迭代器
    vector<const int> v7 = { 1, 2, 3, 4, 5 };
    cout << "\n定义只读(const)义迭代器:------------>" << endl;
    for (vector<const int>::const_iterator it = v7.cbegin(); it != v7.cend(); it++){
        cout << *it << " ";
    }

    //使用解引用符号获取迭代器所指元素
    cout << "\n使用解引用符号获取迭代器所指元素:" << *(v1.begin()) << endl;
    //对于元素是类或者结构体的容器,可以使用解引用和.访问成员,
    //也可以直接使用箭头运算符->访问成员(和指针一样一样的)

    //
    //可以使用+、-、+=、-=一个整数值来是迭代器跳过一些元素
    //可以将两个迭代器相减得到两迭代器之间的差值
    //可以使用>、>、=<、<=来比较两个迭代器的大小


    //使用pop_back()来删除vector的尾元素
    v1.pop_back();

    //使用erase()来删除元素
    v1.erase(v1.begin(), v1.begin() + 5);//删除开始到begin()+5之前那个元素,不包括后者

    //使用clear()来清空vector
    v1.clear();

    //使用{}来将数组中的元素全部初始化为0,不初始化则全为随机值
    int arr1[12]{};
    for (auto i : arr1){//可以使用范围for循环访问数组
        cout << i << " ";
    }

    system("pause");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值