介绍c++常用函数3️⃣

介绍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_distributionnormal_distribution等。

需要注意的是,伪随机数生成器并不是真正的随机数生成器,而是通过一定的算法和种子值生成的“伪随机”序列。因此,在使用随机数时,需要注意种子值的设置和选择合适的随机分布,以及避免在密集循环中频繁调用随机数生成器,从而影响程序性能。

unordered_set

unordered_set<int> mySet;

std::unordered_set的底层实现是哈希表, 使用unordered_set 读写效率是最高的,并不需要对数据进行排序.

unordered_set:无序集合,存储唯一值的集合,不允许重复元素存在。它基于哈希表实现,插入、删除和查找操作的平均时间复杂度是常数时间O(1)。

下面是一些unordered_set常用函数的使用示例:

  1. 插入元素:使用insert函数向unordered_set中插入元素。
std::unordered_set<int> mySet;
mySet.insert(10);
mySet.insert(20);
mySet.insert(30);
  1. 查找元素:使用find函数在unordered_set中查找指定元素。
if (mySet.find(20) != mySet.end()) {
    std::cout << "Element 20 found in the set" << std::endl;
}
  1. 删除元素:使用erase函数从unordered_set中删除指定元素。
mySet.erase(30);
  1. 获取元素数量:使用size函数获取unordered_set中元素的数量。
std::cout << "Size of the set: " << mySet.size() << std::endl;
  1. 遍历元素:使用迭代器或范围循环遍历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 函数来计算数组中等于某个特定值的元素个数,

  • 23
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值