热门标签 | 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

 

 

 


推荐阅读
  • 本文详细介绍了中央电视台电影频道的节目预告,并通过专业工具分析了其加载方式,确保用户能够获取最准确的电视节目信息。 ... [详细]
  • 本文详细探讨了JDBC(Java数据库连接)的内部机制,重点分析其作为服务提供者接口(SPI)框架的应用。通过类图和代码示例,展示了JDBC如何注册驱动程序、建立数据库连接以及执行SQL查询的过程。 ... [详细]
  • 毕业设计:基于机器学习与深度学习的垃圾邮件(短信)分类算法实现
    本文详细介绍了如何使用机器学习和深度学习技术对垃圾邮件和短信进行分类。内容涵盖从数据集介绍、预处理、特征提取到模型训练与评估的完整流程,并提供了具体的代码示例和实验结果。 ... [详细]
  • dotnet 通过 Elmish.WPF 使用 F# 编写 WPF 应用
    本文来安利大家一个有趣而且强大的库,通过F#和C#混合编程编写WPF应用,可以在WPF中使用到F#强大的数据处理能力在GitHub上完全开源Elmis ... [详细]
  • 根据最新发布的《互联网人才趋势报告》,尽管大量IT从业者已转向Python开发,但随着人工智能和大数据领域的迅猛发展,仍存在巨大的人才缺口。本文将详细介绍如何使用Python编写一个简单的爬虫程序,并提供完整的代码示例。 ... [详细]
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • 最近团队在部署DLP,作为一个技术人员对于黑盒看不到的地方还是充满了好奇心。多次咨询乙方人员DLP的算法原理是什么,他们都以商业秘密为由避而不谈,不得已只能自己查资料学习,于是有了下面的浅见。身为甲方,虽然不需要开发DLP产品,但是也有必要弄明白DLP基本的原理。俗话说工欲善其事必先利其器,只有在懂这个工具的原理之后才能更加灵活地使用这个工具,即使出现意外情况也能快速排错,越接近底层,越接近真相。根据DLP的实际用途,本文将DLP检测分为2部分,泄露关键字检测和近似重复文档检测。 ... [详细]
  • 本文探讨了在通过 API 端点调用时,使用猫鼬(Mongoose)的 findOne 方法总是返回 null 的问题,并提供了详细的解决方案和建议。 ... [详细]
  • 深入了解 Windows 窗体中的 SplitContainer 控件
    SplitContainer 控件是 Windows 窗体中的一种复合控件,由两个可调整大小的面板和一个可移动的拆分条组成。本文将详细介绍其功能、属性以及如何通过编程方式创建复杂的用户界面。 ... [详细]
  • 本文详细介绍如何在VSCode中配置自定义代码片段,使其具备与IDEA相似的代码生成快捷键功能。通过具体的Java和HTML代码片段示例,展示配置步骤及效果。 ... [详细]
  • 本文由瀚高PG实验室撰写,详细介绍了如何在PostgreSQL中创建、管理和删除模式。文章涵盖了创建模式的基本命令、public模式的特性、权限设置以及通过角色对象简化操作的方法。 ... [详细]
  • 本文介绍如何使用Python进行文本处理,包括分词和生成词云图。通过整合多个文本文件、去除停用词并生成词云图,展示文本数据的可视化分析方法。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 本文探讨了在Java多线程环境下,如何确保具有相同key值的线程能够互斥执行并按顺序输出结果。通过优化代码结构和使用线程安全的数据结构,我们解决了线程同步问题,并实现了预期的并发行为。 ... [详细]
  • 本文探讨了在 Vue 2.0 项目中使用 Axios 获取数据时可能出现的错误,并提供详细的解决方案和最佳实践。 ... [详细]
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社区 版权所有