C++基础
前言
C++是一种功能强大、灵活的编程语言,广泛应用于系统软件、应用软件、设备驱动、嵌入式软件、高性能服务器和客户端应用程序、游戏引擎等。
一、C和C++的区别
C 和 C++ 是两种广泛使用的编程语言,它们之间有许多区别。C++ 是在 C 的基础上发展而来的,增加了许多新特性和功能。以下是 C 和 C++ 之间的一些主要区别:
- 面向对象编程
C:是面向过程的编程语言,主要通过函数和过程进行编程。
C++:是面向对象的编程语言,支持类和对象。C++ 中的面向对象特性包括封装、继承和多态性。 - 数据抽象和封装
C:没有直接支持数据抽象和封装的语言特性,程序员需要通过结构体和函数进行模拟。
C++:引入了类和对象,通过访问控制符(public、private、protected)实现数据抽象和封装。 - 继承
C:不支持继承,无法通过一个类继承另一个类的属性和方法。
C++:支持继承,可以通过基类和派生类的关系重用代码。 - 多态性
C:不支持多态性,函数重载和运算符重载也不支持。
C++:支持多态性,包括函数重载和运算符重载,以及通过虚函数实现的动态多态性。 - 标准库
C:C 标准库提供了有限的函数,如 stdio.h、stdlib.h 等。
C++:C++ 标准库不仅包含 C 标准库的所有功能,还增加了如 STL(标准模板库),包括容器、迭代器和算法等。 - 内存管理
C:内存管理主要通过 malloc、calloc 和 free 等函数进行。
C++:内存管理可以通过 new 和 delete 操作符进行,此外还支持智能指针(如 std::unique_ptr 和 std::shared_ptr)来自动管理内存。 - 输入输出
C:使用标准的输入输出库函数,如 printf 和 scanf。
C++:使用更高级的 I/O 流库,如 cin 和 cout,支持类型安全和操作符重载。 - 函数和参数
C:函数参数不能有默认值。
C++:函数参数可以有默认值,支持更灵活的函数调用。 - 命名空间
C:没有命名空间,所有标识符共享一个全局命名空间,容易发生命名冲突。
C++:引入了命名空间,通过 namespace 关键字定义命名空间,避免命名冲突。 - 模板
C:不支持模板。
C++:支持模板,可以编写泛型代码,进行代码复用,如模板函数和模板类。 - 异常处理
C:不支持异常处理,错误处理通常通过返回值和错误代码进行。
C++:支持异常处理,通过 try、catch 和 throw 关键字处理异常。 - 兼容性
C:是 C++ 的子集,大部分 C 代码可以在 C++ 编译器下编译,但并非所有 C++ 代码都能在 C 编译器下编译。
C++:可以包含 C 代码并进行编译,但需要注意一些语法和特性的区别。
二、STL标准库
STL(Standard Template Library)是C++标准库的一部分,它提供了许多有用的容器、算法和迭代器。STL的设计目标是提供高效、通用、可复用的数据结构和算法,以及一致的接口和编程风格,使得C++程序员能够更加方便地编写高质量的代码。
STL主要包含以下三个组件:
- 容器(Containers):容器是用于存储和组织数据的类模板,提供了多种数据结构,如向量、列表、映射、集合等。容器可以存储任意类型的数据,并提供了丰富的操作接口,如插入、删除、访问等。STL的容器类模板具有高效的内存管理和数据操作,适用于各种不同的应用场景。
- 迭代器(Iterators):迭代器是一种泛型指针,用于遍历容器中的元素。STL的迭代器提供了统一的访问容器元素的接口,使得算法和容器之间的解耦成为可能。通过使用迭代器,可以实现容器的遍历、查找、排序等操作,同时提高了代码的可读性和可维护性。
- 算法(Algorithms):算法是用于对数据进行操作和处理的函数模板,STL提供了大量的常用算法,如排序、搜索、计算等。这些算法具有通用性,可以应用于不同类型的容器和数据,同时具有高效的实现和优化。通过使用STL的算法,可以简化代码、提高开发效率,并且减少错误的可能性。
2.1 string(字符串类)
string 是 C++ 标准库提供的字符串类,用于处理动态大小的字符串。它提供了丰富的成员函数来处理字符串的操作,如连接、比较、查找等。
函数名称 | 作用 |
---|---|
size() 或 length() | 返回字符串的长度 |
empty() | 检查字符串是否为空 |
append() | 在字符串末尾追加内容 |
substr() | 提取子字符串 |
find() | 查找子字符串的位置 |
replace() | 替换子字符串 |
c_str() | 返回 C 风格字符串 |
2.2 容器
2.2.1 stack(栈)
stack 是一个容器适配器,它基于其他容器(如 deque 或 vector)实现了栈的功能,栈遵循后进先出(LIFO)原则。
push( )
//构造stack
std::stack<int> s;
//将元素压入栈中。
s.push(10);
pop( )
//弹出栈顶元素
s.pop();
top( )
//访问栈顶元素
int topElement = s.top();
empty( )
//检查栈是否为空
bool isEmpty = s.empty();
size( )
//返回栈中的元素个数
size_t stackSize = s.size();
2.2.2 queue(队列)
queue 是一个容器适配器,它基于其他容器(如 deque)实现了队列的功能,队列遵循先进先出(FIFO)原则。常用函数如下:
push( )
//构造
std::queue<int> q;
//将元素添加到队列尾部
q.push(10);
pop( )
//从队列头部移除元素
q.pop();
front( )
//访问队列头部元素。
int frontElement = q.front();
back( )
//访问队列尾部元素。
int backElement = q.back();
empty( )
//检查队列是否为空
bool isEmpty = q.empty();
size( )
//返回队列中的元素个数
size_t queueSize = q.size();
2.2.3 list(双向链表)
list 是一个双向链表容器,允许在链表的任何位置快速插入和删除元素,但访问元素的速度较慢,因为必须通过链表遍历。
push_XXX( )
std::list<int> lst;
//在链表末尾添加元素
lst.push_back(10);
//在链表开头添加元素
lst.push_front(20);
pop_XXX( )
//从链表末尾移除元素
lst.pop_back();
//从链表开头移除元素
lst.pop_front();
front( )
//访问链表的第一个元素。
int frontElement = lst.front();
back( )
//访问链表的最后一个元素
int backElement = lst.back();
insert( )
//在指定位置插入元素
std::list<int>::iterator it = lst.begin();
lst.insert(it, 15); // 在位置it之前插入15
erase( )
//移除指定位置的元素
lst.erase(it); // 移除位置it的元素
empty( )
//检查链表是否为空。
bool isEmpty = lst.empty();
size( )
//返回链表中的元素个数。
size_t listSize = lst.size();
原文地址:https://blog.csdn.net/sincerelover/article/details/140553181
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!