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中的常用容器,提供了高效的数据结构和操作方式。前向列表适合简单的单向链表操作,无序映射列表适合哈希表操作,可以根据具体需求进行选择。