C++中的前向列表和无序映射列表(附例子)

C++中的前向列表和无序映射列表(附例子)

前向列表

前向列表(Forward List)是一种单向链表,它只能从头部进行元素的插入和删除操作。由于只有一个指针指向下一结点,所以空间利用率高,但是访问和删除与插入的速度相差较大。

首先需要包含头文件<forward_list>。创建前向列表可以用如下代码:

#include<forward_list>
using namespace std;

forward_list<int> flist; //创建空列表

对于前向列表,插入操作比较简单,只能在表头进行插入。例如,可以使用下面的代码在前向列表的表头插入新元素:

flist.push_front(1); //在表头插入元素1

删除操作也比较简单,只能删除表头节点,例如:

flist.pop_front(); //删除表头

遍历所有元素可以使用前向迭代器,例如:

for(forward_list<int>::iterator it = flist.begin(); it != flist.end(); it++){
    cout << *it << " "; //输出列表中所有元素
}

无序映射列表

无序映射列表(Unordered Map)是一种哈希表,其内部采用链表方式处理冲突。由于哈希表需要预先指定容器大小,所以当容器大小不足时需要重新分配内存,导致效率降低。但是访问和删除与插入的速度相近。

首先需要包含头文件<unordered_map>。创建无序映射列表可以用如下代码:

#include<unordered_map>
using namespace std;

unordered_map<string, int> umap; //创建空列表

对于无序映射列表,插入可以使用下面的代码:

umap.insert(make_pair("apple", 5)); //插入键值对

访问可以使用下列代码:

cout<< umap["apple"] <<endl; //输出 "5"

删除可以使用下列代码:

umap.erase("apple"); //删除键为"apple"的键值对

遍历所有键值对可以使用下列代码:

for(auto it = umap.begin(); it != umap.end(); it++){
    cout << it->first << ":" << it->second << endl; //输出所有键值对
}

注意,使用自定义的类型作为键需要指定哈希函数和相等函数,例如:

struct Student{
    int id;
    string name;
};

struct HashFunc{
    size_t operator()(const Student& s) const{
        return hash<int>()(s.id);
    }
};

struct EqualFunc{
    bool operator()(const Student& s1, const Student& s2) const{
        return s1.id == s2.id;
    }
};

unordered_map<Student, int, HashFunc, EqualFunc> stuMap;

结论

前向列表和无序映射列表都是C++ STL中的常用容器,提供了高效的数据结构和操作方式。前向列表适合简单的单向链表操作,无序映射列表适合哈希表操作,可以根据具体需求进行选择。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程

C++ 教程