C++数据结构(期末复习)- 第一章 STL

第一章

1.STL中的几个重要的容器

  • Vector
    vector容器是一个动态数组的结构,在内存中有一个指针指向一块连续的内存,它的特点支持随机访问数据,优点:支持随机访问,所以查询效率高。
    缺点:当向其分非尾插入元素时,因内存单元需要移动数据元素,所以插入的效率比较低。
    适用场景:适用于对象简单,变化较小,并且频繁随机访问的场景。
  • List:
    list容器在内存中的结构是类似双向链表结构,每个元素的内存单元结构是不连续的,彼此之间通存储相关的地址进行关联。每一个节点都有三个域,前驱节点指针域,数据域,后驱节点指针域
    优点:因为只类似链表结构在内存中,所以任意位置删除节点和插入节点都是高效的。
    缺点:因为内存单元不连续,所以不支持随机访问操作。
    适用场景:对象变化大,并且对象数量变化频繁,删除和插入操作的情况。
  • Stack(堆栈)
    特点:先进后出
    常用函数:pop(),push(),top(),size(),empty()
  • queue(队列)
    特点:先进先出
    常用函数:pop(), push(), top() ,size(), empty(),front(),back()
    2.STL中的向量(Vector)
    向量是最简单的STL容器,其数据结构与数组相似,占据着一个连续的内存块。由于是连续的,所以向量中的元素可以随机访问,储存空间管理也是自动的,当要将一个元素插入到已满的向量中时,会为向量分配一个更大的内存块,将元素复制进新的内存块,释放原来的空间,所以向量是一个灵活的数组,可以改变自身大小的数组。
    Vector的各种函数操作示例(迭代器是容器中的通用指针):
    代码中用到的成员函数:
push_back() // 从后面添加
reserve(int) //改变向量内存大小
resize(int)  //改变大小
insert(iterator i ,iterator first,iterator last) //插入
at(int n)  //放回第n个元素
erase()//删除元素,可输入一个范围
clear() // 清空向量
assign() //清空向量然后添加新的元素

具体示例区别各个不同的函数

#include <iostream>
#include <vector>
#include <algorithm>
#include <functional> // greater<>

using namespace std;

template<class T>
void printVector(char *s, const vector<T>& v) {
    cout << s << " = (";
    if (v.size() == 0) {
        cout << ")\n";
        return;
    }
    typename vector<T>::const_iterator i = v.begin();
    for ( ; i != v.end()-1; i++)
        cout << *i << ' ';
    cout << *i << ")\n";
}

bool f1(int n) {
    return n < 4;
}

int main() {
    int a[] = {1,2,3,4,5};
    vector<int> v1;      
    printVector("v1",v1);  // v1 is empty, size = 0, capacity = 0
    cout << "size = " << v1.size() << ", capacity = " << v1.capacity() << endl;
    for (int j = 1; j <= 5; j++)
        v1.push_back(j);   // v1 = (1 2 3 4 5), size = 5, capacity = 8
    printVector("v1",v1);
    cout << "size = " << v1.size() << ", capacity = " << v1.capacity() << endl;
    vector<int> v2(3,7); 
    printVector("v2",v2);  // v2 = (7 7 7)
    vector<int>::iterator i1 = v1.begin()+1;
    vector<int> v3(i1,i1+2); 
    printVector("v3",v3);  // v3 = (2 3), size = 2, capacity = 2
    cout << "size = " << v3.size() << ", capacity = " << v3.capacity() << endl;
    vector<int> v4(v1);  
    printVector("v4",v4);  // v4 = (1 2 3 4 5), size = 5, capacity = 5
    cout << "size = " << v4.size() << ", capacity = " << v4.capacity() << endl;
    vector<int> v5(5);   
    printVector("v5",v5);  // v5 = (0 0 0 0 0)
    v5[1] = v5[3] = 9;
    printVector("v5",v5);  // v5 = (0 9 0 9 0)
    v3.reserve(6);       
    printVector("v3",v3);  // v3 = (2 3), size = 2, capacity = 6
    cout << "size = " << v3.size() << ", capacity = " << v3.capacity() << endl;
    v4.resize(7);        
    printVector("v4",v4);  // v4 = (1 2 3 4 5 0 0), size = 7, capacity = 10
    cout << "size = " << v4.size() << ", capacity = " << v4.capacity() << endl;
    v4.resize(3);        
    printVector("v4",v4);  // v4 = (1 2 3), size = 3, capacity = 10
    cout << "size = " << v4.size() << ", capacity = " << v4.capacity() << endl;
    v4.clear();          
    printVector("v4",v4);  // v4 is empty, size = 0, capacity = 10 (!)
    cout << "size = " << v4.size() << ", capacity = " << v4.capacity() << endl;
    v4.insert(v4.end(),v3[1]);
    printVector("v4",v4);         // v4 = (3)
    v4.insert(v4.end(),v3[1]);
    printVector("v4",v4);         // v4 = (3 3)
    v4.insert(v4.end(),2,4);
    printVector("v4",v4);         // v4 = (3 3 4 4)
    v4.insert(v4.end(),v1.begin()+1,v1.end()-1); 
    printVector("v4",v4);         // v4 = (3 3 4 4 2 3 4)
    v4.erase(v4.end()-2);
    printVector("v4",v4);         // v4 = (3 3 4 4 2 4)
    v4.erase(v4.begin(), v4.begin()+4);
    printVector("v4",v4);         // v4 = (2 4)
    v4.assign(3,8);             
    printVector("v4",v4);         // v4 = (8 8 8)
    v4.assign(a,a+3);  
    printVector("v4",v4);         // v4 = (1 2 3)
    vector<int>::reverse_iterator i3 = v4.rbegin();
    for ( ; i3 != v4.rend(); i3++)
        cout << *i3 << ' ';       // print: 3 2 1
    cout << endl;

//  algorithms

    v5[0] = 3;           
    printVector("v5",v5);         // v5 = (3 9 0 9 0)
    replace_if(v5.begin(),v5.end(),f1,7);
    printVector("v5",v5);         // v5 = (7 9 7 9 7)
    v5[0] = 3; v5[2] = v5[4] = 0;
    printVector("v5",v5);         // v5 = (3 9 0 9 0)
    replace(v5.begin(),v5.end(),0,7);
    printVector("v5",v5);         // v5 = (3 9 7 9 7)
    sort(v5.begin(),v5.end()); 
    printVector("v5",v5);         // v5 = (3 7 7 9 9)
    sort(v5.begin(),v5.end(),greater<int>()); 
    printVector("v5",v5);         // v5 = (9 9 7 7 3)
    v5.front() = 2;         
    printVector("v5",v5);         // v5 = (2 9 7 7 3)
}


  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lyzy_czh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值