vector容器,deque容器,sort算法

 

vector维护一段线性的空间,vector提供的是随机访问的迭代器,意思是可以随机访问线性表中的元素。

#include<iostream>
using namespace std;
#include<vector>
void test()
{
    vector<int>v;
    for (int i = 0; i < 10; ++i)
    {
    	v.push_back(i);
    	cout << v.capacity() << endl;
    }
    cout << v[2];
}
int main()
{
    test();
    return 0;
}

vector的数据结构:

#include<iostream>
using namespace std;
#include<vector>
void printfs(vector<int> s)
{
    for (vector<int>::iterator it = s.begin(); it <s.end(); ++it)
    {    
        cout << (*it) <<" ";
    }
    cout << endl;
}
void test()
{
    int p[] = { 1, 2, 3, 4, 5, 6 };
    vector<int>p1(p,p+sizeof(p)/sizeof(int));     //这个就相当于用123456填充p1。(p,p+sizeof(p)/sizeof(int))p就相当于begin,p+sizeof(p)/sizeof(int)就相当于end
    vector<int>p2(p1.begin(), p1.end());
    printfs(p1);
    printfs(p2);
}
void test2()
{
    vector<int>v(10, 100);
    printfs(v);
}
int main()
{
    test();
    test2();
    return 0;
}
void printfs(vector<int> s)
{
    for (vector<int>::iterator it = s.begin(); it <s.end(); ++it)
    {
    	cout << (*it) << " ";
    }
    cout << endl;
}
void test2()
{
    vector<int>v(10, 100);
    vector<int>v1(5, 10);
    v1.swap(v);         //将两个容器之中的数据互换
    printfs(v1);
}
int main()
{
    test2();
    return 0;
}
void printfs(vector<int> s)
{
    for (vector<int>::iterator it = s.begin(); it <s.end(); ++it)
    {
    	cout << (*it) << " ";
    }
    out << endl;
}
void test2()
{
    vector<int>v(10, 100);
    vector<int>v1(5, 10);
    v1.swap(v);         //将两个容器之中的数据互换
    printfs(v1);
    if (v1.empty())     //判断容器 是否为空,返回值是bool类型,为空返回1,不为空返回0
    {
    	cout << "为空" << endl;
    }
    else
    	cout << "不是空" << endl;
}
int main()
{
    test2();
    return 0;
}

 

其他的就不在这里测了,自己下去测

swap收缩空间:

匿名对象特点:当前行结束空间释放。

#include<iostream>
using namespace std;
#include<vector>
void test2()
{
    vector<int>v;
    for (int i = 0; i < 10000; ++i)
    {
    	v.push_back(i);
    }
    cout << "容量" << v.capacity() << endl;         //容量12138
    cout << "大小" << v.size() << endl;             //大小10000
    v.resize(3);
    cout << "容量" << v.capacity() << endl;         //容量12138
    cout << "大小" << v.size() << endl;				//大小3
    vector<int>(v).swap(v);
    cout << "容量" << v.capacity() << endl;         //容量3
    cout << "大小" << v.size() << endl;				//大小3
}
//这里关于vector<int>(v).swap(v);做一下解释
//vector<int>(v)利用v来构造一个匿名对象(匿名对象特点:当前行结束空间释放)
//然后就会得到大小和容量都为3的匿名对象,然后再利用swap交换数据(实际上是交换指针指的指向),对象指向交换后的空间
//当前行结束指向旧空间的对象被释放
int main()
{
    test2();
    return 0;
}

 

//reserve()
#include<iostream>
using namespace std;
#include<vector>
void test2()
{
    vector<int>v;
    int* p = nullptr;
    int num = 0;
    for (int i = 0; i < 10000; ++i)
    {
    	v.push_back(i);
    	if (p != &v[0])           //10000个空间不是一次开辟的,而是根据数据尾插来进行慢慢扩大的,
    	{                         //但是顺序的结构使得扩展的时候旧空间后面不一定有足够的新空间
    		p = &v[0];            //所以每找一次新的空间首元素地址就会发生改变,我们的目的就是查看更换了多少次空间
    		++num;
    	}
    }
    cout << num << endl;
}
void test()
{
    vector<int>v;
    v.reserve(10000);                  //与上面代码相比,reserve就是直接给容器预留出10000个空间,
    int* p = nullptr;                  //这时候在已知容量的情况下这样比较节省时间
    int num = 0;
    for (int i = 0; i < 10000; ++i)
    {
    	v.push_back(i);
    	if (p != &v[0])          
    	{                         
    		p = &v[0];            
    		++num;
    	}
    }
    cout << num << endl;
}

int main()
{
    test2();
    test();
    return 0;
}


运行结果:
24           //第一个寻找24次
1            //预留之后1次
请按任意键继续. . .


vector内部有自己扩容算法

#include<iostream>
using namespace std;
#include<vector>
void test()
{
    vector<int>v;
    v.push_back(10);
    v.push_back(20);
    v.push_back(30);
    v.push_back(40);
    cout << v.front() << endl;
    cout << v.back() << endl;
}
int main()
{
    test();
    return 0;
}
#include<iostream>
using namespace std;
#include<vector>
void printfs(vector<int> s)
{
    for (vector<int>::iterator it = s.begin(); it <s.end(); ++it)
    {
    	cout << (*it) << " ";
    }
    cout << endl;
}
void test()
{
    vector<int>v;
    v.push_back(10);
    v.push_back(20);
    v.push_back(30);
    v.push_back(40);
    cout << v.front() << endl;
    cout << v.back() << endl;
    v.insert((++v.begin()), 2, 100);        //第一个参数必须是迭代器,也就是指针,第二个参数可有可无,
    printfs(v);                             //要是没有默认是1,要是有的话就是你要插入的第三个参数的个数
    v.pop_back();   //尾删
    printfs(v);
    v.erase(v.begin());         //指定迭代器删除
    printfs(v);
    v.erase((v.begin())+2, v.end());       //指定迭代器范围删除    (v.begin())+指针后移两个int位
    printfs(v);
    v.clear();      //清空数据
    printfs(v);
    if (v.empty())       //判断是否为空,为空返回1
    {
    	cout << "已清空\n";
    }
}
int main()
{
    test();
    return 0;
}







运行结果:
10
40
10 100 100 20 30 40
10 100 100 20 30
100 100 20 30
100 100

已清空
请按任意键继续. . .
#include<iostream>
using namespace std;
#include<vector>
void test1()
{
    vector<int>v;
    v.push_back(10);
    v.push_back(20);
    v.push_back(30);
    v.push_back(40);
    printfs(v);
    for (vector<int>::reverse_iterator it = v.rbegin(); it != v.rend(); ++it)
    {
    	cout << (*it)<<" ";         //这里注意两点,第一点逆序遍历提供的迭代器是reverse_iterator
    }                               // 最后使用的仍然是++it,因为为了使用方便人间内部已经维护好了
    cout << endl;
}
int main()
{
    test1();
    return 0;
}
void test2()
{
    //vector迭代器是随机访问迭代器,什么是随机访问迭代器?
    vector<int>v;
    vector<int>::iterator it = v.begin();
    it = it + 3;
    //支持这种写法的都是随机访问迭代器,随机访问就是可以通过迭代器(指针)的指向,随机的访问容器中的数据

}

并不是所有容器的迭代器都支持随机访问

deque容器

deque通过中控器来管理内存,它是通过分段式的内存来存储数据的

#include<deque>
#include<iostream>
using namespace std;
void printfs(const deque<int>& p)
{
    //iterator普通迭代器   reverse_iterator逆序迭代器   const_iterator只读迭代器 
    for (deque<int>::const_iterator it = p.begin(); it != p.end(); ++it)   //这里设置为只读迭代器就不能够在内部对容器元素修改了
    {
    	cout << (*it) << " ";
    }
    cout << endl;
}
void test1()
{
    deque<int>v;
    v.push_back(10);
    v.push_back(20);
    v.push_back(30);
    v.push_front(50);
    v.push_front(40);
    v.push_front(60);
    v.pop_back();
    v.pop_back();
    v.pop_front();
    printfs(v);
    cout << v.back() << endl;
    cout << v.front() << endl;
    //cout << v.capacity << endl;    deque容器没有容量,无法查询容量大小啊
 }
int main()
{
    test1();
    return 0;
}
#include<deque>
#include<iostream>
#include<algorithm>
using namespace std;
void printfs(const deque<int>& p)
{
    //iterator普通迭代器   reverse_iterator逆序迭代器   const_iterator只读迭代器 
    for (deque<int>::const_iterator it = p.begin(); it != p.end(); ++it)   //这里设置为只读迭代器就不能够在内部对容器元素修改了
    {
    	cout << (*it) << " ";
    }
    cout << endl;
}
//要使用系统自带的算法就必须要包含头文件#include<algorithm>
void test2()
{
    deque<int>v;
    v.push_back(4);
    v.push_back(9);
    v.push_back(6);
    v.push_back(7);
    v.push_back(2);

    sort(v.begin(), v.end());         //只能进行从小到达的排序
    printfs(v);
}
int main()
{
    test2();
    return 0;
}

仿函数就是协助算法改变策略,例如sort要是使用从大到小排序,就要加入第三个参数,要么是回调函数,要么是仿函数

#include<deque>
#include<iostream>
#include<algorithm>
using namespace std;
void printfs(const deque<int>& p)
{
    //iterator普通迭代器   reverse_iterator逆序迭代器   const_iterator只读迭代器 
    for (deque<int>::const_iterator it = p.begin(); it != p.end(); ++it)   //这里设置为只读迭代器就不能够在内部对容器元素修改了
    {
    	cout << (*it) << " ";
    }
    cout << endl;
}
bool mycomparent(int a,int b)    //回调函数
{
    return a > b; 
}
void test2()
{
    deque<int>v;
    v.push_back(4);
    v.push_back(9);
    v.push_back(6);
    v.push_back(7);
    v.push_back(2);    
    sort(v.begin(), v.end());         //只能进行从小到达的排序
    printfs(v);
    sort(v.begin(), v.end(), mycomparent);
    printfs(v);
}
int main()
{
    test2();
    return 0;
}

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值