Standard Template Library——STL源码剖析

vector

是一种「变长数组」,即“自动改变数组长度的数组”
it[i] = *(it+i) //这两个写法等价

vector常见用途

1、存储数据
vector本身可以作为数组使用,而且在一些元素个数不确定的场合可以很好地节省空间。
2、用邻接表存储图
使用vector实现邻接表,更为简单。

vector的定义

vector<类型名> 变量名;
类型名可以是int、double、char、struct,也可以是STL容器:vector、set、queue。
vector name;
vector name;
vector name;
vector name;
vector<vector > name;//注意:> >之间要加空格

vector容器内元素的访问

通过迭代器访问
迭代器(iterator)可以理解为指针:font color=“red”>vector<类型名>::iterator 变量名;

#include <iostream>
#include <vector>
using namespace std;

int main(){
    
    
    vector<int> v;
    for (int i = 0; i < 5; i++)
    {
    
    
        v.push_back(i);
    }
    //v.begin()返回v的首元素地址

    vector<int>::iterator it=v.begin();
    for (int i = 0; i < v.size(); i++)
    {
    
    
       cout<<it[i]<<" ";		//0 1 2 3 4
    }
    return 0;
}

与此同时,迭代器与for循环还有一种优雅的写法。

#include <iostream>
#include <vector>
using namespace std;

int main(){
    
    
    vector<int> v;
    for (int i = 0; i < 5; i++)
    {
    
    
        v.push_back(i);
    }
    //vector的迭代器不支持it<v.end()的写法,因此循环条件只能it!=v.end()
    for (vector<int>::iterator it=v.begin(); it!=v.end();it++)
    {
    
    
        cout<<*it<<" ";		
    }
    return 0;
}

此种写法与遍历字符串有异曲同工之妙:

#include <iostream>
#include <vector>
using namespace std;

int main(){
    
    
    string str;
    str="Hello World";
    for (int i = 0; str[i]!='\0'; i++)
    {
    
    
        cout<<str[i]<<" ";			//H e l l o   W o r l d
    }
    return 0;
}

最高阶写法(曾果粒博主完代码风格就是这样啊~)

#include <iostream>
#include <vector>
using namespace std;

int main(){
    
    
    vector<int> v;
    for (int i = 0; i < 5; i++)
    {
    
    
        v.push_back(i);
    }
    
	forint it:v)
    {
    
    
        cout<<*it<<" ";
    }
    return 0;
}

vector常见函数

push_back()、pop_back()		是一对栈元素的压入和弹出
pop_back()	、erase()、clear()	删除操作:尾部一个;选删;全删
insert()		添加
size()		大小
eg: v.erase(v.begin()+3);		//删除v[3]			
v.clear(); 	 // 一键清空

set

set(集合),是一个内部自动有序不含重复元素的容器。

set的定义

像定义变量一样定义set变量: set<类型名> 变量名;
类型名可以是int、double、char、struct,也可以是STL容器:vector、set、queue。

set容器内元素的访问

set只能通过迭代器(iterator)访问:
set::iterator it;
set::iterator it;
这样,就得到了迭代器it,并且可以通过*it来访问set里的元素。

#include <iostream>
#include <set>
using namespace std;

int main()
{
    
    
    set<int> st;
    st.insert(5);
    st.insert(2);
    st.insert(6);
    for (set<int>::iterator it = st.begin(); it != st.end(); it++)
    {
    
    
        cout << *it << endl;
    }
    return 0;
}

我们可以看到,原本无序的元素,被插入set集合后,set内部的元素自动递增排序,并且自动去除了重复元素

set常用函数

insert() 、erase()、size() 、find()
敲黑板:find(value)返回的是set中value所对应的迭代器,也就是value的指针(地址)。

#include <iostream>
#include <set>
using namespace std;
int main()
{
    
    
    set<int> st;
    for (int i = 1; i <= 3; i++)
    {
    
    
        st.insert(i);
    }

    set<int>::iterator it = st.find(2); //在set中查找2,返回其迭代器
    cout << *it << endl;

    // 以上可以直接x携程
    cout << *(st.find(2)) << endl;
    return 0;
}
#include <iostream>
#include <set>
using namespace std;

int main()
{
    
    
    set<int> st;
    st.insert(100);
    st.insert(200);
    st.insert(100);
    st.insert(300);
    set<int>::iterator it = st.find(200);
//1.删除单个元素
 st.erase(st.find(100)); 	//利用find()函数找到100,然后用erase删除它
     // 删除单个元素
  st.erase(100);		//删除单个元素
//2.删除一个区间内的所有元素
    st.erase(it, st.end());
    for (it = st.begin(); it != st.end(); it++)
    {
    
    
        cout << *it << endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_73344394/article/details/130359956
今日推荐