📅  最后修改于: 2023-12-03 15:14:03.473000             🧑  作者: Mango
C++中的地图向量(Map)是一个内置容器,它存储键值对(Key-Value Pairs),其中每个键(key)唯一对应一个值(value)。地图向量基于树结构实现,因此它具有快速查找、插入和删除的优点。在本文中,我们将介绍地图向量的基本用法和一些范例。
定义地图向量需要引入头文件 map
,然后使用类模板 map<Key, Value>
,其中 Key 是键的类型,Value 是值的类型。以下是一个定义地图向量的例子:
#include <map>
#include <string>
using namespace std;
int main() {
map<string, int> m;
return 0;
}
在上例中,我们定义了一个键的类型为 string
, 值的类型为 int
的地图向量 m
。
可以使用成员函数 insert(pair<Key, Value>)
或 emplace(Key, Value)
插入键值对到地图向量中。其中 pair<Key, Value>
表示一个键值对,emplace
函数可以更有效率的创建此类对象。以下是一个插入键值对的例子:
m.insert(pair<string, int>("apple", 3));
m.insert(make_pair("banana", 2));
m.emplace("cherry", 5);
在上例中,我们向地图向量中插入了三个键值对,它们分别是 ("apple", 3)
,("banana", 2)
和 ("cherry", 5)
。
可以使用下标运算符 []
或成员函数 at(Key)
访问地图向量中对应键的值。如果指定的键不存在,则会返回一个值为 0 的新元素。以下是一个访问值的例子:
int apple_count = m["apple"]; // 返回3
int cherry_count = m.at("cherry"); // 返回5
int orange_count = m["orange"]; // 返回一个值为0的新元素
在上例中,我们访问了地图向量中 ("apple", 3)
和 ("cherry", 5)
对应的值,并访问了一个不存在的键 "orange"。
可以使用 for
循环结合迭代器(iterator)遍历地图向量。以下是一个遍历地图向量的例子:
for (auto it = m.begin(); it != m.end(); ++it) {
cout << it->first << " => " << it->second << endl;
}
在上例中,it
是一个迭代器,指向地图向量中的一个元素,it->first
和 it->second
分别是它的键和值。
以下是一个计算词频的例子,它读取一个文件中的单词,并统计每个单词出现的次数:
#include <iostream>
#include <fstream>
#include <sstream>
#include <map>
#include <string>
using namespace std;
int main() {
string filename = "text.txt";
ifstream fin(filename);
if (!fin.is_open()) {
cout << "Error: cannot open file " << filename << endl;
return 1;
}
map<string, int> freq;
string line, word;
while (getline(fin, line)) {
istringstream iss(line);
while (iss >> word) {
++freq[word];
}
}
for (auto it = freq.begin(); it != freq.end(); ++it) {
cout << it->first << " => " << it->second << endl;
}
return 0;
}
在上例中,我们读取文件 "text.txt"
中的每一行,然后用 istringstream
分割每一行成为单词。对于每个单词,我们使用 ++freq[word]
增加它出现的次数。其中 freq[word]
会自动创建一个键为 word
, 值为 0 的新元素,然后使用 ++
操作符来递增它的值。
以下是一个计算字母频率的例子,它读取一个文件中的内容,并统计每个字母出现的次数:
#include <iostream>
#include <fstream>
#include <map>
#include <string>
using namespace std;
int main() {
string filename = "text.txt";
ifstream fin(filename);
if (!fin.is_open()) {
cout << "Error: cannot open file " << filename << endl;
return 1;
}
map<char, int> freq;
char c;
while (fin.get(c)) {
if (isalpha(c)) {
c = tolower(c);
++freq[c];
}
}
for (auto it = freq.begin(); it != freq.end(); ++it) {
cout << it->first << " => " << it->second << endl;
}
return 0;
}
在上例中,我们读取文件 "text.txt"
中的每个字符,然后使用 isalpha
和 tolower
函数来判断和转换字母。对于每个字母,我们使用 ++freq[c]
增加它出现的次数。其中 freq[c]
会自动创建一个键为 c
, 值为 0 的新元素,然后使用 ++
操作符来递增它的值。
本文介绍了 C++ 中的地图向量(Map)的基本用法和一些范例。地图向量是一个有用的容器,它可以存储键值对,并且具有快速查找、插入和删除的优点。我们可以将它应用于求解各种数据统计的问题,如计算词频、字母频率等等。