热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C++基础代码1

STLCSTL(标准模板库)是一套功能强大的C模板类。STL从广义上分为:容器(container)算法&

STL

C++ STL(标准模板库)是一套功能强大的 C++ 模板类。

STL从广义上分为:容器(container)算法(algorithm)迭代器(iterator)


STL的六大组件


  1. Container(容器) 各种基本数据结构,如vector、list、deque、set、map等,用来存放数据
  2. Algorithm(算法) 各种基本算法,如sort、find、copy、for_each…等
  3. Iterator(迭代器) 连接containers和algorithms
  4. Adapter(适配器) 可改变containers、Iterators或Function object接口的一种组件
  5. Function object(仿函数) :行为类似函数、可作为算法的某种策略。
  6. Allocator(分配器) 负责空间的配置与管理。

1.Vector


vector基本概念

功能:


  • vector数据结构和数组非常相似,也称为单端数组

vector与普通数组区别:


  • 不同之处在于数组是静态空间,而vector可以动态扩展

动态扩展:


  • 并不是在原空间之后续接新空间,而是找更大的内存空间,然后将原数据拷贝新空间,释放原空间
  • vector容器的迭代器是支持随机访问的迭代器

 


vector赋值操作

功能描述:


  • 给vector容器进行赋值

函数原型:


  • vector& operator=(const vector &vec);//重载等号操作符

  • assign(beg, end); //将[beg, end)区间中的数据拷贝赋值给本身。

  • assign(n, elem); //将n个elem拷贝赋值给本身。

示例:

#include void printVector(vector& v) {for (vector::iterator it &#61; v.begin(); it !&#61; v.end(); it&#43;&#43;) {cout <<*it <<" ";}cout <}//赋值操作
void test01()
{vector v1; //无参构造for (int i &#61; 0; i <10; i&#43;&#43;){v1.push_back(i);}printVector(v1);vectorv2;v2 &#61; v1;printVector(v2);vectorv3;v3.assign(v1.begin(), v1.end());printVector(v3);vectorv4;v4.assign(10, 100);printVector(v4);
}int main() {test01();system("pause");return 0;
}

vector容量和大小

功能描述&#xff1a;


  • 对vector容器的容量和大小操作

函数原型&#xff1a;


  • empty(); //判断容器是否为空

  • capacity(); //容器的容量

  • size(); //返回容器中元素的个数

  • resize(int num); //重新指定容器的长度为num&#xff0c;若容器变长&#xff0c;则以默认值填充新位置。

    ​ //如果容器变短&#xff0c;则末尾超出容器长度的元素被删除。

  • resize(int num, elem); //重新指定容器的长度为num&#xff0c;若容器变长&#xff0c;则以elem值填充新位置。

    ​ //如果容器变短&#xff0c;则末尾超出容器长度的元素被删除

实例&#xff1a; 

#include
#include void test01()
{//创建一个vector容器std::vector v;//向容器中插入数据for (int i &#61; 0; i <10; i&#43;&#43;){v.push_back(i);}std::cout <}int main()
{test01();return 0;
}

vector插入和删除

功能描述&#xff1a;


  • 对vector容器进行插入、删除操作

函数原型&#xff1a;


  • push_back(ele); //尾部插入元素ele
  • pop_back(); //删除最后一个元素
  • insert(const_iterator pos, ele); //迭代器指向位置pos插入元素ele
  • insert(const_iterator pos, int count,ele);//迭代器指向位置pos插入count个元素ele
  • erase(const_iterator pos); //删除迭代器指向的元素
  • erase(const_iterator start, const_iterator end);//删除迭代器从start到end之间的元素
  • clear(); //删除容器中所有元素

#include
#include void printVector(std::vector& v)
{for (std::vector::iterator it &#61; v.begin(); it !&#61; v.end(); it&#43;&#43;) {std::cout <<*it <<" ";}std::cout <}//插入和删除
void test01()
{std::vector v1;//尾插v1.push_back(10);v1.push_back(20);v1.push_back(30);v1.push_back(40);v1.push_back(50);printVector(v1);//尾删v1.pop_back();printVector(v1);//插入v1.insert(v1.begin(), 100);printVector(v1);v1.insert(v1.begin(), 2, 1000);printVector(v1);//删除v1.erase(v1.begin());printVector(v1);//清空v1.erase(v1.begin(), v1.end());v1.clear();printVector(v1);
};int main()
{test01();return 0;
}

10 20 30 40 50
10 20 30 40
100 10 20 30 40
1000 1000 100 10 20 30 40
1000 100 10 20 30 40

vector数据存取

功能描述&#xff1a;


  • 对vector中的数据的存取操作

函数原型&#xff1a;


  • at(int idx); //返回索引idx所指的数据
  • operator[]; //返回索引idx所指的数据
  • front(); //返回容器中第一个数据元素
  • back(); //返回容器中最后一个数据元素

#include
#include void test01()
{std::vector v;for (int i &#61; 0; i <2; i&#43;&#43;){v.push_back(i);}for (int i &#61; 0; i <2; i&#43;&#43;){std::cout <};int main()
{test01();return 0;
}

0
1
0
1
vector front 0
vector back 1

vector互换容器

功能描述&#xff1a;


  • 实现两个容器内元素进行互换

函数原型&#xff1a;


  • swap(vec); // 将vec与本身的元素互换

示例&#xff1a;

#include void printVector(vector& v) {for (vector::iterator it &#61; v.begin(); it !&#61; v.end(); it&#43;&#43;) {cout <<*it <<" ";}cout <}void test01()
{vectorv1;for (int i &#61; 0; i <10; i&#43;&#43;){v1.push_back(i);}printVector(v1);vectorv2;for (int i &#61; 10; i > 0; i--){v2.push_back(i);}printVector(v2);//互换容器cout <<"互换后" <}void test02()
{vector v;for (int i &#61; 0; i <100000; i&#43;&#43;) {v.push_back(i);}cout <<"v的容量为&#xff1a;" <(v).swap(v); //匿名对象cout <<"v的容量为&#xff1a;" <}int main() {test01();test02();system("pause");return 0;
}

vector预留空间

功能描述&#xff1a;


  • 减少vector在动态扩展容量时的扩展次数

函数原型&#xff1a;


  • reserve(int len);//容器预留len个元素长度&#xff0c;预留位置不初始化&#xff0c;元素不可访问。


vecor获取元素

容器&#xff1a;vector

算法&#xff1a;for_each

迭代器&#xff1a;vector::interator

#include
#include
#include // 标准算法头文件using namespace std;void myPrint(int val)
{cout <}void test01()
{//创建一个vector容器vector v;//向容器中插入数据v.push_back(10);v.push_back(20);v.push_back(30);v.push_back(40);//通过迭代器访问容器中的数据vector::iterator itBegin &#61; v.begin(); //起始迭代器 指向容器中的第一个元素vector::iterator itEnd &#61; v.end(); //结束迭代器 指向容器中最后一个元素的下一个位置//第一种遍历方式while (itBegin !&#61; itEnd){cout <<*itBegin <::iterator it &#61; v.begin(); it !&#61; v.end(); it&#43;&#43;){cout <<*it <}int main()
{test01();return 0;
}

 vector存放自定义数据类型

#include
#include
#include using namespace std;class Person{
public:Person(string name, int age){this->m_Name &#61; name;this->m_Age &#61; age;}string m_Name;int m_Age;
};void test01()
{vector v;Person person1("zhangsan", 24);Person person2("lisi", 25);Person person3("wangerma", 26);//向容器中添加数据v.push_back(person1);v.push_back(person2);v.push_back(person3);//遍历容器for(vector::iterator it &#61; v.begin(); it !&#61; v.end(); it&#43;&#43;){cout <<"姓名&#xff1a;" <<(*it).m_Name <<"年龄&#xff1a;" <<(*it).m_Age <m_Name <<"年龄&#xff1a;" <m_Age <}int main(){test01();return 0;
}

姓名&#xff1a;zhangsan年龄&#xff1a;24
姓名&#xff1a;zhangsan年龄&#xff1a;24
姓名&#xff1a;lisi年龄&#xff1a;25
姓名&#xff1a;lisi年龄&#xff1a;25
姓名&#xff1a;wangerma年龄&#xff1a;26
姓名&#xff1a;wangerma年龄&#xff1a;26

#include
#include
#include using namespace std;class Person{
public:Person(string name, int age){this->m_Name &#61; name;this->m_Age &#61; age;}string m_Name;int m_Age;
};void test01()
{vector v;Person person1("zhangsan", 24);Person person2("lisi", 25);Person person3("wangerma", 26);//向容器中添加数据v.push_back(&person1);v.push_back(&person2);v.push_back(&person3);//遍历容器for(vector::iterator it &#61; v.begin(); it !&#61; v.end(); it&#43;&#43;){cout <<"姓名&#xff1a;" <<(*it)->m_Name <<"年龄&#xff1a;" <<(*it)->m_Age <}int main(){test01();return 0;
}

map/ multimap容器


map基本概念

简介&#xff1a;


  • map中所有元素都是pair
  • pair中第一个元素为key&#xff08;键值&#xff09;&#xff0c;起到索引作用&#xff0c;第二个元素为value&#xff08;实值&#xff09;
  • 所有元素都会根据元素的键值自动排序

本质&#xff1a;


  • map/multimap属于关联式容器&#xff0c;底层结构是用二叉树实现。

优点&#xff1a;


  • 可以根据key值快速找到value值

map和multimap区别&#xff1a;


  • map不允许容器中有重复key值元素
  • multimap允许容器中有重复key值元素

map构造和赋值

功能描述&#xff1a;


  • 对map容器进行构造和赋值操作

函数原型&#xff1a;

构造&#xff1a;


  • map mp; //map默认构造函数:
  • map(const map &mp); //拷贝构造函数

赋值&#xff1a;


  • map& operator&#61;(const map &mp); //重载等号操作符

示例&#xff1a;

#include
#include void printMap1(std::map m)
{for(std::map::iterator it &#61; m.begin(); it !&#61; m.end(); it&#43;&#43;){std::cout <<"key &#61; " <<(*it).first <<" value &#61; " <second <}void printMap2(std::map m)
{for(auto it: m){std::cout <<"key &#61; " <}int main()
{std::map m;m.insert(std::pair(1,10));m.insert(std::pair(2,20));printMap1(m);//拷贝构造函数std::map m2(m);printMap1(m2);
}

key &#61; 1 value &#61; 10
key &#61; 2 value &#61; 20
key &#61; 1 value &#61; 10
key &#61; 2 value &#61; 20

map大小和交换

功能描述&#xff1a;


  • 统计map容器大小以及交换map容器

函数原型&#xff1a;


  • size(); //返回容器中元素的数目
  • empty(); //判断容器是否为空
  • swap(st); //交换两个集合容器

map插入和删除

功能描述&#xff1a;


  • map容器进行插入数据和删除数据

函数原型&#xff1a;


  • insert(elem); //在容器中插入元素。
  • clear(); //清除所有元素
  • erase(pos); //删除pos迭代器所指的元素&#xff0c;返回下一个元素的迭代器。
  • erase(beg, end); //删除区间[beg,end)的所有元素 &#xff0c;返回下一个元素的迭代器。
  • erase(key); //删除容器中值为key的元素。

示例&#xff1a;

#include
#include void printMap(std::map m)
{for(auto it: m){std::cout <<"key &#61; " <}int main()
{std::map m;// 第一种插入方式m.insert(std::pair(1, 10));// 第二种插入方式m.insert(std::make_pair(2, 20));// 第三种插入方式m.insert(std::map::value_type(3, 30));//第四种插入方式&#xff0c;不建议使用这种插入&#xff0c;用途 可以利用key访问到valuem[4] &#61; 40; printMap(m);//删除m.erase(m.begin());printMap(m);m.erase(3);printMap(m);//清空m.erase(m.begin(),m.end());m.clear();printMap(m);}

3.deque容器


3.3.1 deque容器基本概念

功能&#xff1a;


  • 双端数组&#xff0c;可以对头端进行插入删除操作

deque与vector区别&#xff1a;


  • vector对于头部的插入删除效率低&#xff0c;数据量越大&#xff0c;效率越低
  • deque相对而言&#xff0c;对头部的插入删除速度回比vector快
  • vector访问元素时的速度会比deque快,这和两者内部实现有关

deque内部工作原理:

deque内部有个中控器&#xff0c;维护每段缓冲区中的内容&#xff0c;缓冲区中存放真实数据

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


3.3.3 deque赋值操作

功能描述&#xff1a;


  • 给deque容器进行赋值

函数原型&#xff1a;


  • deque& operator&#61;(const deque &deq); //重载等号操作符

  • assign(beg, end); //将[beg, end)区间中的数据拷贝赋值给本身。

  • assign(n, elem); //将n个elem拷贝赋值给本身。

#include
#include void printDeque01(std::deque d)
{for (auto it:d){std::cout <}void printDeque02(std::deque &d)
{for(std::deque::iterator it &#61; d.begin(); it !&#61; d.end(); it&#43;&#43;){std::cout <<*it <}int main()
{std::deque d1;for(int i; i <10;i&#43;&#43;){d1.push_back(i);}printDeque01(d1);// printDeque02(d1);std::deque d2(d1.begin(), d1.end());printDeque01(d2);std::deque d3(10, 12);printDeque01(d3);std::deque d4(d1);printDeque01(d4);
}

3.3.4 deque大小操作

功能描述&#xff1a;


  • 对deque容器的大小进行操作

函数原型&#xff1a;


  • deque.empty(); //判断容器是否为空

  • deque.size(); //返回容器中元素的个数

  • deque.resize(num); //重新指定容器的长度为num,若容器变长&#xff0c;则以默认值填充新位置。

    ​ //如果容器变短&#xff0c;则末尾超出容器长度的元素被删除。

  • deque.resize(num, elem); //重新指定容器的长度为num,若容器变长&#xff0c;则以elem值填充新位置。

    ​ //如果容器变短&#xff0c;则末尾超出容器长度的元素被删除。


3.3.5 deque 插入和删除

功能描述&#xff1a;


  • 向deque容器中插入和删除数据

函数原型&#xff1a;

两端插入操作&#xff1a;


  • push_back(elem); //在容器尾部添加一个数据
  • push_front(elem); //在容器头部插入一个数据
  • pop_back(); //删除容器最后一个数据
  • pop_front(); //删除容器第一个数据

指定位置操作&#xff1a;


  • insert(pos,elem); //在pos位置插入一个elem元素的拷贝&#xff0c;返回新数据的位置。

  • insert(pos,n,elem); //在pos位置插入n个elem数据&#xff0c;无返回值。

  • insert(pos,beg,end); //在pos位置插入[beg,end)区间的数据&#xff0c;无返回值。

  • clear(); //清空容器的所有数据

  • erase(beg,end); //删除[beg,end)区间的数据&#xff0c;返回下一个数据的位置。

  • erase(pos); //删除pos位置的数据&#xff0c;返回下一个数据的位置


3.3.5 deque 插入和删除

功能描述&#xff1a;


  • 向deque容器中插入和删除数据

函数原型&#xff1a;

两端插入操作&#xff1a;


  • push_back(elem); //在容器尾部添加一个数据
  • push_front(elem); //在容器头部插入一个数据
  • pop_back(); //删除容器最后一个数据
  • pop_front(); //删除容器第一个数据

指定位置操作&#xff1a;


  • insert(pos,elem); //在pos位置插入一个elem元素的拷贝&#xff0c;返回新数据的位置。

  • insert(pos,n,elem); //在pos位置插入n个elem数据&#xff0c;无返回值。

  • insert(pos,beg,end); //在pos位置插入[beg,end)区间的数据&#xff0c;无返回值。

  • clear(); //清空容器的所有数据

  • erase(beg,end); //删除[beg,end)区间的数据&#xff0c;返回下一个数据的位置。

  • erase(pos); //删除pos位置的数据&#xff0c;返回下一个数据的位置


3.3.6 deque 数据存取

功能描述&#xff1a;


  • 对deque 中的数据的存取操作

函数原型&#xff1a;


  • at(int idx); //返回索引idx所指的数据
  • operator[]; //返回索引idx所指的数据
  • front(); //返回容器中第一个数据元素
  • back(); //返回容器中最后一个数据元素

3.6 queue 容器


3.6.1 queue 基本概念

概念&#xff1a;Queue是一种先进先出(First In First Out,FIFO)的数据结构&#xff0c;它有两个出口

队列容器允许从一端新增元素&#xff0c;从另一端移除元素

队列中只有队头和队尾才可以被外界使用&#xff0c;因此队列不允许有遍历行为

队列中进数据称为 — 入队 push

队列中出数据称为 — 出队 pop


3.6.2 queue 常用接口

功能描述&#xff1a;栈容器常用的对外接口

构造函数&#xff1a;


  • queue que; //queue采用模板类实现&#xff0c;queue对象的默认构造形式
  • queue(const queue &que); //拷贝构造函数

赋值操作&#xff1a;


  • queue& operator&#61;(const queue &que); //重载等号操作符

数据存取&#xff1a;


  • push(elem); //往队尾添加元素
  • pop(); //从队头移除第一个元素
  • back(); //返回最后一个元素
  • front(); //返回第一个元素

大小操作&#xff1a;


  • empty(); //判断堆栈是否为空
  • size(); //返回栈的大小

示例&#xff1a;

#include
#include
#include class Person
{
public:Person(std::string name, int age){this->name &#61; name;this->age &#61; age;}std::string name;int age;
};int main()
{//创建队列std::queue q;//准备数据Person p1("唐僧", 30);Person p2("孙悟空", 1000);Person p3("猪八戒", 900);Person p4("沙僧", 800);q.push(p1);q.push(p2);q.push(p3);q.push(p4);while(!q.empty()){std::cout <<"队头元素-- 姓名&#xff1a; " <}

 


4.string

本质&#xff1a;


  • string是C&#43;&#43;风格的字符串&#xff0c;而string本质上是一个类

string和char *区别&#xff1a;


  • char *是一个指针
  • string是一个类&#xff0c;类内部封装了char*&#xff0c;管理这个字符串&#xff0c;是一个char*型的容器

特点&#xff1a;

string类内部封装了很多成员方法

例如&#xff1a;查找find&#xff0c;拷贝copy&#xff0c;删除delete替换replace&#xff0c;插入insert

sring管理char*所分配到额内存&#xff0c;不用担心复制越界和取值越界等&#xff0c;由类内部进行负责。


string赋值操作

功能描述&#xff1a;


  • 给string字符串进行赋值

赋值的函数原型&#xff1a;


string字符串拼接


  •  &#43;&#61; 
  • append

#include
#include using namespace std;int main(){string str1 &#61; "I LOVE";string str2 &#61; "GAME";str1 &#43;&#61; str2;cout <<"str1:" <}

str1:I LOVEGAME
str1:I LOVEGAMEGAME

 string 字符串查找和替换

 find从左往右查找&#xff0c;rfind从右往左找

 replace

#include
#include using namespace std;
//find
void test01(){string str1 &#61; "I LOVE";int pos &#61; str1.find("LO");if(pos &#61;&#61; -1){cout <<"not find" <}
//replace
void test02(){string str1 &#61; "abcdef";//从1号位置起三个字符&#xff0c;替换成"1111str1.replace(1, 3, "1111");cout <<"str1:" <}int main(){test01();test02();
}

pos:2
str1:a1111ef

string字符存取


  •  char& operator[](int n)  //通过[]方式获取字符
  • char& at(int n)

#include
#include using namespace std;void test01(){string str1 &#61; "abcdefg";for(int i &#61; 0;i }int main(){test01();
}

string插入和删除


  • insert 插入
  • erase 删除

#include
#include using namespace std;void test01(){string str1 &#61; "abcdefg";//insertstr1.insert(1, "haizei");cout <}int main(){test01();
}

ahaizeibcdefg
abcdefg

string子串


  • substr

#include
#include using namespace std;void test01(){string str1 &#61; "abcdefg";string sub_str &#61; str1.substr(1,3);cout <}int main(){test01();
}

 bcd

 

 

 


推荐阅读
author-avatar
追忆幽梦_554
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有