📜  C++中的地图向量及范例(1)

📅  最后修改于: 2023-12-03 15:14:03.473000             🧑  作者: Mango

C++中的地图向量及范例

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->firstit->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" 中的每个字符,然后使用 isalphatolower 函数来判断和转换字母。对于每个字母,我们使用 ++freq[c] 增加它出现的次数。其中 freq[c] 会自动创建一个键为 c, 值为 0 的新元素,然后使用 ++ 操作符来递增它的值。

结论

本文介绍了 C++ 中的地图向量(Map)的基本用法和一些范例。地图向量是一个有用的容器,它可以存储键值对,并且具有快速查找、插入和删除的优点。我们可以将它应用于求解各种数据统计的问题,如计算词频、字母频率等等。