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转换为大写字母
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值