C++学习笔记之stl库及常用函数


一、STL标准库

  STL(Standard Template Library)是C++标准库的一部分,它提供了许多有用的容器、算法和迭代器。STL的设计目标是提供高效、通用、可复用的数据结构和算法,以及一致的接口和编程风格,使得C++程序员能够更加方便地编写高质量的代码。
STL主要包含以下三个组件:

  • 容器(Containers):容器是用于存储和组织数据的类模板,提供了多种数据结构,如向量、列表、映射、集合等。容器可以存储任意类型的数据,并提供了丰富的操作接口,如插入、删除、访问等。STL的容器类模板具有高效的内存管理和数据操作,适用于各种不同的应用场景。
  • 迭代器(Iterators):迭代器是一种泛型指针,用于遍历容器中的元素。STL的迭代器提供了统一的访问容器元素的接口,使得算法和容器之间的解耦成为可能。通过使用迭代器,可以实现容器的遍历、查找、排序等操作,同时提高了代码的可读性和可维护性。
  • 算法(Algorithms):算法是用于对数据进行操作和处理的函数模板,STL提供了大量的常用算法,如排序、搜索、计算等。这些算法具有通用性,可以应用于不同类型的容器和数据,同时具有高效的实现和优化。通过使用STL的算法,可以简化代码、提高开发效率,并且减少错误的可能性。

1.1 string(字符串类)

  string 是 C++ 标准库提供的字符串类,用于处理动态大小的字符串。它提供了丰富的成员函数来处理字符串的操作,如连接、比较、查找等。

函数名称作用
size() 或 length()返回字符串的长度
empty()检查字符串是否为空
append()在字符串末尾追加内容
substr()提取子字符串
find()查找子字符串的位置
replace()替换子字符串
c_str()返回 C 风格字符串

1.2 容器

1.2.1 vector(动态数组)

vector与数组array类似,其使用更加灵活的动态空间来进行配置。在空间不足的时候,vector可以自动扩展空间容纳新元素,做到按需供给。在扩充空间的过程中仍然需要的是,重新分配空间、移动数据、释放原空间。
at( )

// 构造
std::vector<int> vec;
// 修改元素
vec.at(1) = 20;

push_back( )

// 添加元素到末尾
vec.push_back(6);

pop_back( )

// 删除最后一个元素
vec.pop_back();

insert( )

// 插入元素
vec.insert(vec.begin() + 2, 15);  // 在第三个位置插入 15

erase( )

// 删除指定位置的元素
vec.erase(vec.begin() + 2);

clear( )

// 清空 vector
vec.clear();

1.2.2 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();

1.2.3 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();

1.2.4 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();

1.2.5 unordered_map(哈希映射)和unordered_set(哈希集合)

  哈希表容器是由unordered_map和unordered_set提供的。它们使用哈希表来存储和查找元素,能够在平均情况下实现常数时间的插入、删除和查找操作。
 unordered_map 是一个关联容器,它存储的是键值对(key-value pairs),每个键都是唯一的。它使用哈希表来实现,因此插入、删除和查找操作在平均情况下具有常数时间复杂度。
  unordered_set 是一个集合容器,它存储的是唯一的元素,没有重复。它使用哈希表来实现,因此插入、删除和查找操作在平均情况下也具有常数时间复杂度。

使用哈希表容器的优势

  • 快速查找:哈希表提供了常数时间的查找、插入和删除操作。
  • 唯一性:对于unordered_set,哈希表确保了元素的唯一性。

适用场景

  • 当需要快速查找、插入和删除操作时,unordered_map和unordered_set是很好的选择。
  • 当需要存储键值对数据时,unordered_map是合适的选择。
  • 当需要存储唯一元素集合时,unordered_set是合适的选择。

unordered_map 常用操作
insert( )

//插入元素
myMap["key"] = value;
myMap.insert({"key", value});

find( )
  返回指向该键值对的迭代器;如果键不存在,返回 end() 迭代器。

//查找元素
auto it = myMap.find("key");

erase( )

//删除元素
myMap.erase("key");

count( )
  对于 std::unordered_map,返回值只能是 0 或 1,因为每个键在 unordered_map 中是唯一的

//检查某个元素是否存在于哈希表中
my_map.count(key);

unordered_set 常见操作
insert( )

//插入元素:
mySet.insert(value);

find( )

//查找元素
auto it = mySet.find(value);

erase( )

//删除元素
mySet.erase(value);

count( )
  对于 std::unordered_set,返回值同样是 0 或 1,因为集合中的元素是唯一的。

//检查某个元素是否存在于哈希集合(std::unordered_set)中。
my_set.count(element);

1.2.6 集合

  set 是 C++ 标准库中的一个关联容器,用于存储唯一元素,并且这些元素会自动按照升序(默认)或用户定义的顺序进行排序。set 的底层实现基于平衡二叉搜索树(通常是红黑树),因此它提供了高效的插入、删除和查找操作。set具有:

  1. 唯一性:set 中的每个元素都是唯一的,如果尝试插入一个已经存在的元素,插入操作不会生效。
  2. 有序性:set 中的元素会自动按照升序排列(默认情况下)。
  3. 动态大小:可以根据需要自动调整其大小。

  set的使用方法和哈希映射(集合)类似,但是二者存在一定区别:

特性setunordered_set
底层实现平衡二叉搜索树哈希表
有序性按升序排列(默认)无序
查找时间复杂度O(log n)平均 O(1),最坏 O(n)
适用场景需要有序存储需要快速查找、插入、删除,且不关心顺序

二、常用函数

2.1 sort( )

  sort 用于对容器或数组中的元素进行排序。它位于 头文件中。

// 升序排列
/* 如果是字符串的组合,则会根据其前缀的公共程度排序,例如:14.最长公共前缀 */
sort(起始迭代器, 结束迭代器);
// 降序排列
sort(v.begin(), v.end(), std::greater<int>());

2.2 reverse( )

  reverse 用于反转容器或数组中元素的顺序,同样位于 头文件中。

reverse(起始迭代器, 结束迭代器);

2.3 max( ) 和 min( )

  max 和 min 用于获取两个值中的最大值和最小值,定义在 头文件中。

// 取较大者
max(a, b);
// 取较小者
min(a, b);

2.4 accumulate( )

  accumulate 用于计算容器或数组中元素的累计和,它定义在 头文件中。

accumulate(起始迭代器, 结束迭代器, 初始值);

2.5 find( )

  find 用于在容器或数组中查找指定的元素,返回一个指向该元素的迭代器,它位于 头文件中。

/* 这里类似与容器中的.find,如果没有找到了会返回.end */
find(起始迭代器, 结束迭代器, 要查找的值);

2.6 copy( )

  copy 用于将一个范围内的元素复制到另一个范围,位于 头文件中。

copy(起始迭代器, 结束迭代器, 目标起始迭代器(可选));

2.7 to_string( )

  to_string 是 C++ 标准库中的一个函数,用于将数值类型转换为其对应的字符串表示形式。

/* 将基本的数值类型(如整数、浮点数)转换为 string 类型的字符串。 */
/*  返回值是一个 std::string,其中包含了数值的字符串表示形式。   */
string to_string(int val);
string to_string(long val);
string to_string(long long val);
string to_string(unsigned val);
string to_string(unsigned long val);
string to_string(unsigned long long val);
string to_string(float val);
string to_string(double val);
string to_string(long double val);

2.8 stoi( )

  stoi用于将string 类型的字符串转换为 int 类型的整数。stoi 是 string to integer 的缩写。

int stoi(const std::string& str, std::size_t* pos = 0, int base = 10);
  • 参数说明
    • str:要转换的字符串。
    • pos(可选):指向 size_t 的指针,函数执行完毕后,这个指针会指向第一个未处理字符的下标。如果不需要,可以传递 nullptr 或使用默认值。
    • base(可选):表示进制,默认为 10,表示将字符串解释为十进制数。如果需要转换其他进制的数,比如二进制、八进制或十六进制,可以传递相应的值(2、8、16)。
  • 返回值:返回转换后的整数值。

2.9 getline( )

   agetline 函数在 C++ 中用于从输入流中读取一行文本,直到遇到换行符 \n(或者其他指定的分隔符),并将读取的内容存储到一个字符串中。

getline(std::istream& is, std::string& str, char delim);

//示例
#include <iostream>
		...
   	vector<std::string> words;
    string word;
    stringstream ss(s);

    while (getline(ss, word, ',')) {  // 以逗号为分隔符提取单词
        words.push_back(word);
    }
  • 参数说明
    • is:输入流对象,可以是 std::cin、std::ifstream、std::istringstream 等。
    • str:字符串对象,getline 将读取的内容存储到该字符串中。
    • delim(可选):自定义分隔符,如果不指定,默认使用换行符 \n 作为分隔符。

2.10 字符判断

函数名功能
isalpha(char c)判断是否是字母
islower(char c)判断是否是小写字母
isupper(char c)判断是否是大写字母
isdigit(char c)判断是否是数字
isalnum(char c)判断是否是字母或者数字
tolower(char c)将c转换为小写字母
toupper(char c)将c转换为大写字母
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值