c++重拾 STL vector使用

vector

标准库vector表示对象的集合,其中所有的对象类型都相同。有了vector就尽量不要用数组了。我在oj上做编程题时,用数组时就可能出现一些无法理解的错误,而仅仅把定义改成vector就完全没问题。

定义,初始化

vector<int> v1;
vector<vector<string>> file;
vector<Node> t; 还可以为自定义类型变量。
常见:

vector<int> v;
for(int i=0;i!=100;++i){
	v.push_back(i);
}

string word;
vector<string> text;
while(cin>>word){
	text.push_back(word);
}

c++标准要求vector应该能在运行时高效地添加元素。

操作

熟悉增删查改。

  • v.empty() 判空

  • v.size() 查容器大小(元素个数)

  • v[i] 可用下标访问元素

  • v1= v2 拷贝

  • v1== v2 v1!=v2 比较

  • v.begin() 返回指向容器第一个元素的迭代器

  • v.end() 返回指向容器最后一个元素的迭代器

  • 增:插入元素
    v.push_back(elem) 添加元素(在尾部追加一个元素)

    v.insert(iter_pos, elem) 在iteration position处插入一个元素elem
    v.insert(iter_pos, m, elem) 在iterationposition处插入m个元素elem
    eg:
    v.insert(v.begin(), 666); 在最前面插入一个元素666
    v.insert(v.begin()+i, 888); 在v[i]处插入一个元素(自然v[i]就让位),或者说在现在的v[i]前插入一个元素888;或者说,在第i个元素后面添加

  • 删:
    v.pop_back() 删除最后一个元素 void pop_back ( );注意只删除,并不返回元素
    v.erase(iter_pos) 删除iter_pos处的元素
    v.erase(beg, end) 删除区间**[beg, end)的元素,注意是右开区间,不包括end**
    v.erase(v.begin()) 删除开头那个元素 ,或者说删除v[0]
    v.erase(v.begin()+i) 删除v[i]
    v.erase(v.begin()+i, v.begin()+j) 删除v[i]到v[j]的元素,不包括v[j]

    v.clear() 移除容器中所有的元素。

例子

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int> v;
    int elem;
    cout<<"intput elements: ";
    while(cin>>elem){
        v.push_back(elem); //添加元素(末尾追加)
    }
    //原{2,4,6,8}

    //判断容器空不空:
    cout<<v.empty()<<endl;

    cout<<"---------------"<<endl;
    //insert插入元素:
    cout<<"changing..... ";
    //v.insert(v.begin(), 666);//在最前面插入666  ||结果:666 2 4 6 8
    //v.insert(v.begin()+1, 666);//在第一个元素之后插入666/ 或者说,在v[1]前面插入元素666  ||结果:2 666 4 6 8
    v.insert(v.begin()+1, 2, 666);// 在第一个元素之后插入 2个 666  ||结果:2 666 666 4 6 8

    //erase删除元素:
    v.erase(v.begin());//删除v[0]/ 或者说删除最前面的元素   ||结果:666 666 4 6 8
    v.erase(v.begin(), v.begin()+2);//删除[v[0],v[2])区间的元素,注意是包括v[0],但不包括v[2]  ||结果:4 6 8

    cout<<"changed: ";
    cout<<"the first elem:"<< v.front()<<" 等价于v[0]:"<<v[0]<<endl;

    for(auto x: v){
        cout<<x<<" ";
    }

    cout<<"大小: "<<v.size()<<endl;

    //移除容器中所有元素:
    v.clear();
    cout<<"clear()后的容器大小: "<<v.size()<<endl;

    cout<<"添加5个888后: ";
    v.insert(v.begin(),5,888);
    //可以采用下标遍历,推荐采用范围for
    for(int i=0;i<int(v.size());++i){
        cout<<v[i]<<" ";
    }

    cout<<"重设大小:大于原容器大小的,补0;小于原容器大小的,后面的就不要了"<<endl;
    v.resize(10);
    for(auto x: v){
        cout<<x<<" ";   //输出:888 888 888 888 888 0 0 0 0 0
    }


    return 0;
}

关于容器容量的变化,有兴趣的,可以看一下下面这个代码:
v.capacity()容器容量
v.size()容器里元素个数

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int> v;

    cout<<"容器容量:"<<v.capacity()<<endl;  //0

    int elem;
    cout<<"intput elements: ";
    while(cin>>elem){
        v.push_back(elem); //添加元素(末尾追加)
    }
    //原{2,4,6,8}
    cout<<"容器容量:"<<v.capacity()<<endl;  //4


    //判断容器空不空:
    cout<<v.empty()<<endl;

    cout<<"---------------"<<endl;
    //insert插入元素:
    cout<<"changing..... ";
    //v.insert(v.begin(), 666);//在最前面插入666  ||结果:666 2 4 6 8
    //v.insert(v.begin()+1, 666);//在第一个元素之后插入666/ 或者说,在v[1]前面插入元素666  ||结果:2 666 4 6 8
    v.insert(v.begin()+1, 2, 666);// 在第一个元素之后插入 2个 666  ||结果:2 666 666 4 6 8
    
    cout<<"容器容量:"<<v.capacity()<<endl;  //8 这个时候元素6个,容器容量增长为8了

    //erase删除元素:
    v.erase(v.begin());//删除v[0]/ 或者说删除最前面的元素   ||结果:666 666 4 6 8
    v.erase(v.begin(), v.begin()+2);//删除[v[0],v[2])区间的元素,注意是包括v[0],但不包括v[2]  ||结果:4 6 8

    cout<<"changed: ";
    cout<<"the first elem:"<< v.front()<<" 等价于v[0]:"<<v[0]<<endl;

    for(auto x: v){
        cout<<x<<" ";
    }

    cout<<"大小: "<<v.size()<<endl;


    //移除容器中所有元素:
    v.clear();
    cout<<"clear()后的容器大小: "<<v.size()<<endl;//0
    cout<<"容器容量:"<<v.capacity()<<endl;//仍然为8


    cout<<"添加5个888后: ";
    v.insert(v.begin(),5,888);
    //可以采用下标遍历,推荐采用范围for
    for(int i=0;i<int(v.size());++i){
        cout<<v[i]<<" ";
    }

    cout<<"容器容量:"<<v.capacity()<<endl; //8

    cout<<"重设大小:大于原容器大小的,补0;小于原容器大小的,后面的就不要了"<<endl;
    v.resize(10);
    for(auto x: v){
        cout<<x<<" ";   //输出:888 888 888 888 888 0 0 0 0 0
    }

    cout<<"容器容量:"<<v.capacity()<<endl; //10 容量在增长

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