介绍c++常用函数和方法(日常使用)3️⃣
链表类的相关功能
在链表类中实现这些功能:
MyLinkedlist linkedlist = new MyLinkedlist();
- get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。
- addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。
- addAtTail(val):将值为 val 的节点追加到链表的最后一个元素。
- addAtIndex(index,val):在链表中的第 index 个节点之前添加值为 val 的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。
- deleteAtIndex(index):如果索引 index 有效,则删除链表中的第 index 个节点。
定义链表结构
struct ListNode {
int val;
ListNode *next;
ListNode() : val(0), next(nullptr) {}
ListNode(int x) : val(x), next(nullptr) {}
ListNode(int x, ListNode *next) : val(x), next(next) {}
};
初始化
ListNode* dummy_head=new ListNode(0);
异常处理机制
在C++中,我们可以使用try-catch
语句块来处理可能发生的异常。其基本语法如下:
Copy Codetry {
// 可能会引发异常的代码
}
catch (exception_type1 exception_name1) {
// 处理类型为exception_type1的异常
}
catch (exception_type2 exception_name2) {
// 处理类型为exception_type2的异常
}
catch (...) {
// 处理所有其他类型的异常
}
在上述代码中,try
后面的代码块是可能会引发异常的代码,如果抛出了异常,则会被相应类型的catch
语句块所捕获,并进行相应的处理。
其中,exception_type
是异常类型,exception_name
是捕获到的异常对象的名称。catch (...)
是一个特殊的catch语句块,用于处理除前面指定的异常类型以外的所有异常。
例如,以下代码演示了如何使用try-catch语句块来处理除数为0的异常:
#include <iostream>
using namespace std;
int main() {
int a, b, result;
cout << "请输入两个整数:";
cin >> a >> b;
try {
if (b == 0) {
throw runtime_error("除数不能为0!");
}
result = a / b;
cout << a << " / " << b << " = " << result << endl;
}
catch (runtime_error e) {
cout << "发生了异常:" << e.what() << endl;
}
return 0;
}
在上述代码中,我们使用了一个try-catch
语句块来处理除数为0的异常。如果输入的除数为0,则会抛出一个runtime_error
类型的异常,并输出自定义的错误信息"除数不能为0!"。
在catch
语句块中,我们捕获并处理这个异常,并输出相应的错误信息。这样,即使输入的除数为0,程序也能够正常地输出错误提示信息,而不会崩溃。
随机数生成
C++标准库提供了伪随机数生成器,可以通过<random>
头文件中的类和函数来生成随机数。
常用的随机数引擎是std::mt19937
,它可以通过指定一个种子值来生成不同的随机数序列。例如:
#include <iostream>
#include <random>
using namespace std;
int main() {
random_device rd; // 获取随机种子
mt19937 gen(rd()); // 根据种子生成随机数引擎
uniform_int_distribution<> dis(1, 6); // 定义随机整数分布,范围为[1,6]
for (int i = 0; i < 10; ++i) {
cout << dis(gen) << " "; // 生成随机数并输出
}
cout << endl;
return 0;
}
在上述代码中,我们首先使用random_device
类获取一个随机种子,并将其传递给mt19937
类的构造函数,生成一个随机数引擎。
然后,我们使用uniform_int_distribution
类定义了一个随机整数分布,它的范围是[1,6]。
最后,我们在循环中调用dis(gen)
来生成随机数,并输出到控制台。
除了uniform_int_distribution
类,C++标准库还提供了其他类型的随机分布,如uniform_real_distribution
、normal_distribution
等。
需要注意的是,伪随机数生成器并不是真正的随机数生成器,而是通过一定的算法和种子值生成的“伪随机”序列。因此,在使用随机数时,需要注意种子值的设置和选择合适的随机分布,以及避免在密集循环中频繁调用随机数生成器,从而影响程序性能。
unordered_set
unordered_set<int> mySet;
std::unordered_set的底层实现是哈希表, 使用unordered_set 读写效率是最高的,并不需要对数据进行排序.
unordered_set
:无序集合,存储唯一值的集合,不允许重复元素存在。它基于哈希表实现,插入、删除和查找操作的平均时间复杂度是常数时间O(1)。
下面是一些unordered_set
常用函数的使用示例:
- 插入元素:使用
insert
函数向unordered_set
中插入元素。
std::unordered_set<int> mySet;
mySet.insert(10);
mySet.insert(20);
mySet.insert(30);
- 查找元素:使用
find
函数在unordered_set
中查找指定元素。
if (mySet.find(20) != mySet.end()) {
std::cout << "Element 20 found in the set" << std::endl;
}
- 删除元素:使用
erase
函数从unordered_set
中删除指定元素。
mySet.erase(30);
- 获取元素数量:使用
size
函数获取unordered_set
中元素的数量。
std::cout << "Size of the set: " << mySet.size() << std::endl;
- 遍历元素:使用迭代器或范围循环遍历
unordered_set
中的元素。
for (int element : mySet) {
std::cout << element << std::endl;
}
// 或者使用迭代器
for (auto it = mySet.begin(); it != mySet.end(); ++it) {
std::cout << *it << std::endl;
}
unordered_map
unordered_map
:无序映射,存储键值对的关联容器。它基于哈希表实现,可以通过键快速地查找对应的值。插入、删除和查找操作的平均时间复杂度是常数时间O(1)。
unordered_map<std::string, int> myMap;
范围-based for 循环()
范围-based for 循环(range-based for loop)是C++11引入的一种语法结构,用于简化遍历容器、数组或其他支持迭代器的对象的操作。它提供了一种更加直观和简洁的方式来迭代元素,减少了手动管理迭代器的复杂性。
范围-based for 循环的基本语法如下:
for (element_declaration : range_expression)
{
// 循环体
}
其中,element_declaration
是一个新建的变量,用于存储每次循环迭代得到的元素值。range_expression
是要遍历的范围,可以是一个容器、数组、字符串或其他支持迭代器的对象。
在每次迭代时,循环将自动将范围表达式中的元素赋值给 element_declaration
,然后执行循环体内的代码块。循环将依次处理范围中的每个元素,直到遍历完所有元素为止。
范围-based for 循环隐藏了迭代器的使用细节,使代码更加简洁和易读。它是一种高效而方便的遍历容器元素的方式,常用于遍历数组、向量、列表、集合等容器类型,以及字符串的字符等情况。
需要注意的是,范围-based for 循环对于遍历容器中的元素是只读的,无法修改容器中的元素值。如果需要修改元素,可以使用传统的迭代器循环或索引循环来实现。
下面是一个使用范围-based for 循环遍历 vector 容器中整型元素并计算总和的例子:
#include <iostream>
#include <vector>
int main() {
std::vector<int> myVec = {1, 2, 3, 4, 5};
int sum = 0;
for (int elem : myVec) {
sum += elem;
}
std::cout << "Sum of vector elements: " << sum << std::endl;
return 0;
}
在这个例子中,我们定义了一个 std::vector<int>
类型的容器 myVec
,并使用范围-based for 循环遍历其中的所有元素。循环依次将容器中的每个整型元素赋值给 elem
变量,并将其加入到变量 sum
中,最终输出所有元素的总和。
find函数
容易遗忘的一点是:find函数返回的是在原来中第一次出现位置的索引!请记住
count函数
count
函数是C++标准库中的一个算法函数,用于计算指定范围内满足特定条件的元素个数。count
函数的语法如下:
template <class InputIterator, class T>
typename iterator_traits<InputIterator>::difference_type
count (InputIterator first, InputIterator last, const T& val);
参数说明:
first
:指向要搜索的范围内的起始位置的迭代器。last
:指向要搜索的范围内的结束位置的迭代器(不包含在搜索范围内)。val
:要统计出现次数的值。
count
函数会遍历指定范围内的元素,统计与给定值 val
相等的元素的个数,并返回这个数量。例如,如果我们有一个数组 arr
,我们可以使用 count
函数来计算数组中等于某个特定值的元素个数,