C++STL笔记

简介: C++STL笔记

C++STL笔记


长久以来软件界一直希望建立一种可重复利用的东西

面向对象和泛型编程,目的就是复用性的提升

STL从广义上分为容器,算法和迭代

容器和算法之间通过迭代器进行无缝连接

STL几乎所有的代码都采用了模板类或者模板函数

STL的六大组件

容器,算法,迭代器,仿函数,空间配置器,适配器

1.容器:各种数据结构,如vector,list,deque,set,map等,来存放数据

2.算法:各种常用的算法,如sort,find,copy,for_each等

3.迭代器:扮演了容器和算法之间的胶合器

4仿函数:行为类似函数,可作为算法的某种策略

5.适配器:一种用来修饰容器或者仿函数或迭代器接口的东西

6.空间配置器:负责空间的配置和管理

容器

容器可以分为序列式容器和关联式容器

算法

可以分为质变算法和非质变算法

迭代器

输入迭代器

输出迭代器

前向迭代器

双向迭代器

随机访问迭代器

vector的遍历方法

#include<iostream>
#include<vector>
using namespace std;
int main(){
    vector<int> a;
    a.push_back(10);
    a.push_back(20);
    a.push_back(30);
    a.push_back(40);
    vector<int>::iterator abegin=a.begin();
    vector<int>::iterator aend=a.end();
    while(abegin!=aend){
        cout <<*abegin<<endl;
        abegin++; 
    }
    return 0;
}
#include<iostream>
#include<vector>
using namespace std;
int main(){
    vector<int> a;
    a.push_back(10);
    a.push_back(20);
    a.push_back(30);
    a.push_back(40);
    vector<int>::iterator abegin=a.begin();
    vector<int>::iterator aend=a.end();
    for(vector<int>::iterator it=a.begin();it!=a.end();it++){
        cout <<*it<<endl;
    }
    return 0;
}
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void myprint(int a){
    cout <<a<<endl;
}
int main(){
    vector<int> a;
    a.push_back(10);
    a.push_back(20);
    a.push_back(30);
    a.push_back(40);
    vector<int>::iterator abegin=a.begin();
    vector<int>::iterator aend=a.end();
    for_each(abegin,aend,myprint);
    return 0;
}

Vector容器嵌套容器

vector<vector<int>>v;

#include<iostream>
#include<vector>
using namespace std;
vector<vector<int> > v;
vector<int> v1;
vector<int> v2;
vector<int> v3;
vector<int> v4; 
int main(){
    for(int i=0;i<4;i++){
        v1.push_back(i+1);
        v2.push_back(i+2);
        v3.push_back(i+3);
        v4.push_back(i+4);
    }
    v.push_back(v1);
    v.push_back(v2);
    v.push_back(v3);
    v.push_back(v4);
    for(vector<vector<int> >::iterator it=v.begin();it!=v.end();it++){
        for(vector<int>::iterator vit=(*it).begin();vit!=(*it).end();vit++)
            cout <<*vit<<' ';
            cout <<endl;
    }
    return 0;
} 
/*
[Error] '>>' should be '> >' within a nested template argument list
vector<vector<int> >嵌套时候> >中间要加一个空格 
*/

string

字符串string本质是一个类

char *是个指针

string是个类,类的内部封装了char *,管理这个字符串,是个char *的容器

string中有很多成员方法

string(); //创建一个空字符串,例如string str;

string'(const char* s) //使用字符串s初始化

string(const string& str)使用一个string对象初始化另一个string对象

string(int n,char c);使用n个字符初始化

string str4;

str4.assign("hello world");

#include<iostream>
#include<string>
using namespace std;
int main(){
    string str;
    str.assign("hello world");
    cout <<str<<endl;
    string str2;
    str2=str;
    cout <<str2<<endl;
    string str3="hello world";
    cout <<str3<<endl;
    return 0;
}

字符串拼接

#include<iostream>
#include<string>
using namespace std;
int main(){
    string str;
    str.assign("hello world");
    str+=",hello C++";
    str+='!';
    str.append("\nI love Code!");
    str.append("hackerdsdsg",6);
    str.append("tyut yyds",4,5);
    cout <<str<<endl;
    return 0;
}

字符串查找

查找指定字符串是否存在

在指定位置替换字符串

find rfind

str1.find("as",1);

find找的是第一次出现的位置

rfind找的是最后一次位置

replace替换

replace(1,3,"1111");

从一位开始,替换3个字符,换成字符串" 1111"

字符串比较

compare

string存取

str.size();返回长度

str[i]; str.at(i);可以访问每一个元素

字符串的插入和删除

insert(pose,"");

erase(pose,num);

子串获取

substr

vector

单端数组

数组是静态空间,而vector可以动态扩展

并不是在原空间之后连接空间,而是找更大的内存空间,然后将原数据拷贝到新空间

构造

vector的迭代器支持随机访问

vector<int> v3(num,data);

vector<int> v2(v1.begin(),v1.end());

vector<int> v4(v3);

赋值

push_back();

v1=v2;

assign(10,100);

assign(v3.begin(),v3.end());

容量和大小

empty();

capacity(); //容器的容量

size();//返回容器中容量的大小

capacity>=size

resize(int num)重新制定容器长度

resize(int num,elem);容器如果变长,用elem填充新位置

#include<iostream>
#include<vector>
using namespace std;
void printVector(vector<int>&v){
    for(vector<int>::iterator it=v.begin();it!=v.end();it++)
        cout <<*it<<' ';
        cout <<endl; 
} 
void test01(){
    vector<int>v;
    for(int i=0;i<10;i++)
        v.push_back(i);
    printVector(v);
    if(v.empty()){
        cout <<"v1为空"<<endl;
    }
    else{
        cout <<"v1不为空"<<endl;
        cout <<"v1的容量是"<<v.capacity()<<endl;
        cout <<"v1的大小是" <<v.size()<<endl;
    }
    v.resize(15,100);   //将长度加长为15,默认用0填充新的位置 
    printVector(v);
    v.resize(5);
    printVector(v);    //将长度缩短,超出的会删除掉 
} 
int main(){
    test01();
    return 0;
} 

插入和删除

#include<iostream>
#include<vector>
using namespace std;
int main(){
    vector<int>v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    v.push_back(4);
    v.pop_back();   //将最后一个数据4弹出 
    v.insert(v.begin(),100);    //在迭代器的位置插入一个数据100
    v.insert(v.begin(),3,1000);  //在迭代器的位置插入n个数据
    v.erase(v.begin());  //将迭代器位置的数据删除 
    for(vector<int>::iterator it=v.begin();it!=v.end();it++)
        cout <<*it<<' ';
        cout <<endl;
    return 0;
}

Vector的数据存取

v.size();

用中括号和at访问第i个元素

.front();

返回第一个元素

.back();

返回最后一个元素

容器互换

v1.swap(v2);

用swap收缩内存

v.resize();

vector<int>(v).swap(v);

预留空间

reserve();

不停的加数据,会重新分配内存

可以直接预存空间,避免太多次分配内存

deque

双端数组

构造函数

deque内部有个中控区,维护每段缓冲区的内容,缓冲区中存放真实数据

中控器维护的是每个缓冲区的地址,使得使用deque时像一片连续的内存空间

#include<iostream>
#include<deque>
using namespace std;
int main(){
    deque<int> u;
    u.push_front(1);
    u.push_front(2);
    u.push_back(3);
    u.push_back(4);
    u.push_front(5);
    for(deque<int>::iterator it=u.begin();it!=u.end();it++)
        cout <<*it<<' ';
        cout <<endl;
        cout <<u.size();
        cout <<endl;
        cout <<u.empty(); 
    cout <<endl;
    for(int i=0;i<u.size();i++)
    cout <<u.at(i);
    cout <<u.back();
    return 0;
} 

速度没有vector快

赋值操作

d2=d1;

d3.assign(开始迭代器,终止迭代器);

大小操作

empty();

size();

resize();

插入删除

push_back();

push_front();

pop_front();

pop_back();

insert(pos,elem);

insert(pos,n,elem);

insert(pos,beg,end);

clear();

数据存取

at()或者[];

front();第一个元素;

back();最后一个元素;

排序

#include<iostream>
using namespace std;
#include<deque>
#include<algorithm>
deque<int> u;
int n;
int a;
int main(){
    cin >>n;
    while(n--){cin >>a; u.push_back(a);}
    sort(u.begin(),u.end());
    for(deque<int>::iterator it=u.begin();it!=u.end();it++){
        cout <<*it<<' ';
    }
    return 0;
}

stack

stack<int> stk;

push();

pop();

top();

empty();

size();

queue

push();

pop();

front();

back();

empty();

size();

list

由结点组成,数据域和指针域

可以对任意位置进行快速插入和删除

容器遍历速度没有数组快

占用的空间比数组大

STL中的链表是双向循环的链表,next,prev

.front(); .back(); .begin(); pop_back(); .end();

采用动态分配内存

时间和空间额外耗费大

assign(begin,end);

.swap();

大小操作

resize();

empty();

pop_back();

pop_front();

insert();

clear();

erase();

remove();

数据存取

front();

back();

翻转和排序

reserve();

set

关联式容器

set不允许有重复的元素

multiset允许容器中有重复的元素

set叫关联式容器

multiset 允许容器中有重复的元素

set.insert(10);

交换和大小

size();

swap();

插入和删除数据

insert();

clear();

erase();

查找和统计

find();查找数值是否存在,若存在,返回下标

count(); 统计key的个数

Pari

pair<int,int> p(q,a);

pair<int,int> p=make_pair(q,a);

set容器的排序

利用仿函数

map

multimap

map<int,int>

m.insert(pair<int,int>(1,10));

swap();

相关文章
|
1天前
|
存储 缓存 C++
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
C++ 标准模板库(STL)提供了一组功能强大的容器类,用于存储和操作数据集合。不同的容器具有独特的特性和应用场景,因此选择合适的容器对于程序的性能和代码的可读性至关重要。对于刚接触 C++ 的开发者来说,了解这些容器的基础知识以及它们的特点是迈向高效编程的重要一步。本文将详细介绍 C++ 常用的容器,包括序列容器(`std::vector`、`std::array`、`std::list`、`std::deque`)、关联容器(`std::set`、`std::map`)和无序容器(`std::unordered_set`、`std::unordered_map`),全面解析它们的特点、用法
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
|
4月前
|
存储 算法 C++
C++ STL 初探:打开标准模板库的大门
C++ STL 初探:打开标准模板库的大门
144 10
|
26天前
|
C++ 容器
【c++丨STL】stack和queue的使用及模拟实现
本文介绍了STL中的两个重要容器适配器:栈(stack)和队列(queue)。容器适配器是在已有容器基础上添加新特性或功能的结构,如栈基于顺序表或链表限制操作实现。文章详细讲解了stack和queue的主要成员函数(empty、size、top/front/back、push/pop、swap),并提供了使用示例和模拟实现代码。通过这些内容,读者可以更好地理解这两种数据结构的工作原理及其实现方法。最后,作者鼓励读者点赞支持。 总结:本文深入浅出地讲解了STL中stack和queue的使用方法及其模拟实现,帮助读者掌握这两种容器适配器的特性和应用场景。
56 21
|
1天前
|
存储 算法 C++
深入浅出 C++ STL:解锁高效编程的秘密武器
C++ 标准模板库(STL)是现代 C++ 的核心部分之一,为开发者提供了丰富的预定义数据结构和算法,极大地提升了编程效率和代码的可读性。理解和掌握 STL 对于 C++ 开发者来说至关重要。以下是对 STL 的详细介绍,涵盖其基础知识、发展历史、核心组件、重要性和学习方法。
|
2月前
|
编译器 C语言 C++
【c++丨STL】list模拟实现(附源码)
本文介绍了如何模拟实现C++中的`list`容器。`list`底层采用双向带头循环链表结构,相较于`vector`和`string`更为复杂。文章首先回顾了`list`的基本结构和常用接口,然后详细讲解了节点、迭代器及容器的实现过程。 最终,通过这些步骤,我们成功模拟实现了`list`容器的功能。文章最后提供了完整的代码实现,并简要总结了实现过程中的关键点。 如果你对双向链表或`list`的底层实现感兴趣,建议先掌握相关基础知识后再阅读本文,以便更好地理解内容。
47 1
|
2月前
|
算法 C语言 C++
【c++丨STL】list的使用
本文介绍了STL容器`list`的使用方法及其主要功能。`list`是一种双向链表结构,适用于频繁的插入和删除操作。文章详细讲解了`list`的构造函数、析构函数、赋值重载、迭代器、容量接口、元素访问接口、增删查改操作以及一些特有的操作接口如`splice`、`remove_if`、`unique`、`merge`、`sort`和`reverse`。通过示例代码,读者可以更好地理解如何使用这些接口。最后,作者总结了`list`的特点和适用场景,并预告了后续关于`list`模拟实现的文章。
69 7
|
3月前
|
存储 编译器 C语言
【c++丨STL】vector的使用
本文介绍了C++ STL中的`vector`容器,包括其基本概念、主要接口及其使用方法。`vector`是一种动态数组,能够根据需要自动调整大小,提供了丰富的操作接口,如增删查改等。文章详细解释了`vector`的构造函数、赋值运算符、容量接口、迭代器接口、元素访问接口以及一些常用的增删操作函数。最后,还展示了如何使用`vector`创建字符串数组,体现了`vector`在实际编程中的灵活性和实用性。
137 4
|
3月前
|
C语言 C++ 容器
【c++丨STL】string模拟实现(附源码)
本文详细介绍了如何模拟实现C++ STL中的`string`类,包括其构造函数、拷贝构造、赋值重载、析构函数等基本功能,以及字符串的插入、删除、查找、比较等操作。文章还展示了如何实现输入输出流操作符,使自定义的`string`类能够方便地与`cin`和`cout`配合使用。通过这些实现,读者不仅能加深对`string`类的理解,还能提升对C++编程技巧的掌握。
143 5
|
3月前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
93 2
|
3月前
|
存储 算法 Linux
【c++】STL简介
本文介绍了C++标准模板库(STL)的基本概念、组成部分及学习方法,强调了STL在提高编程效率和代码复用性方面的重要性。文章详细解析了STL的六大组件:容器、算法、迭代器、仿函数、配接器和空间配置器,并提出了学习STL的三个层次,旨在帮助读者深入理解和掌握STL。
103 0