C++基础


前言

  C++是一种功能强大、灵活的编程语言,广泛应用于系统软件、应用软件、设备驱动、嵌入式软件、高性能服务器和客户端应用程序、游戏引擎等。

一、C和C++的区别

  C 和 C++ 是两种广泛使用的编程语言,它们之间有许多区别。C++ 是在 C 的基础上发展而来的,增加了许多新特性和功能。以下是 C 和 C++ 之间的一些主要区别:

  1. 面向对象编程
    C:是面向过程的编程语言,主要通过函数和过程进行编程。
    C++:是面向对象的编程语言,支持类和对象。C++ 中的面向对象特性包括封装、继承和多态性。
  2. 数据抽象和封装
    C:没有直接支持数据抽象和封装的语言特性,程序员需要通过结构体和函数进行模拟。
    C++:引入了类和对象,通过访问控制符(public、private、protected)实现数据抽象和封装。
  3. 继承
    C:不支持继承,无法通过一个类继承另一个类的属性和方法。
    C++:支持继承,可以通过基类和派生类的关系重用代码。
  4. 多态性
    C:不支持多态性,函数重载和运算符重载也不支持。
    C++:支持多态性,包括函数重载和运算符重载,以及通过虚函数实现的动态多态性。
  5. 标准库
    C:C 标准库提供了有限的函数,如 stdio.h、stdlib.h 等。
    C++:C++ 标准库不仅包含 C 标准库的所有功能,还增加了如 STL(标准模板库),包括容器、迭代器和算法等。
  6. 内存管理
    C:内存管理主要通过 malloc、calloc 和 free 等函数进行。
    C++:内存管理可以通过 new 和 delete 操作符进行,此外还支持智能指针(如 std::unique_ptr 和 std::shared_ptr)来自动管理内存。
  7. 输入输出
    C:使用标准的输入输出库函数,如 printf 和 scanf。
    C++:使用更高级的 I/O 流库,如 cin 和 cout,支持类型安全和操作符重载。
  8. 函数和参数
    C:函数参数不能有默认值。
    C++:函数参数可以有默认值,支持更灵活的函数调用。
  9. 命名空间
    C:没有命名空间,所有标识符共享一个全局命名空间,容易发生命名冲突。
    C++:引入了命名空间,通过 namespace 关键字定义命名空间,避免命名冲突。
  10. 模板
    C:不支持模板。
    C++:支持模板,可以编写泛型代码,进行代码复用,如模板函数和模板类。
  11. 异常处理
    C:不支持异常处理,错误处理通常通过返回值和错误代码进行。
    C++:支持异常处理,通过 try、catch 和 throw 关键字处理异常。
  12. 兼容性
    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();
  • 10
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值