std::map要求键唯一,每个键仅映射一个值,支持operator[];std::multimap允许键重复,可存储多个相同键的键值对,不支持operator[],需用equal_range访问所有值。

C++ STL中的
std::multimap
std::map
std::map
std::multimap
在我看来,理解
std::map
std::multimap
std::map
insert
operator[]
而
std::multimap
它们两者在底层实现上,通常都基于自平衡二叉搜索树(比如红黑树),这保证了插入、删除、查找等操作的对数时间复杂度
O(logN)
立即学习“C++免费学习笔记(深入)”;
operator[]
std::map
operator[]
myMap[key] = value;
operator[]
std::multimap
operator[]
operator[]
myMultimap[key]
插入行为:
std::map
insert({key, value})myMap[key] = newValue;
myMap.at(key) = newValue;
std::multimap
insert({key, value})查找多个值:
std::map
find(key)
std::multimap
equal_range(key)
lower_bound(key)
upper_bound(key)
这是一个简单的代码示例,展示了它们的核心行为差异:
#include <iostream>
#include <map>
#include <multimap>
#include <string>
int main() {
// std::map 示例
std::map<int, std::string> myMap;
myMap.insert({1, "Apple"});
myMap.insert({2, "Banana"});
myMap.insert({1, "Orange"}); // 键1已存在,此插入操作会被忽略
std::cout << "std::map 键1的值 (首次插入): " << myMap[1] << std::endl; // 输出: Apple
myMap[1] = "Grape"; // 使用 operator[] 覆盖键1的值
std::cout << "std::map 键1的值 (operator[] 覆盖后): " << myMap[1] << std::endl; // 输出: Grape
std::cout << "---------------------------------" << std::endl;
// std::multimap 示例
std::multimap<int, std::string> myMultimap;
myMultimap.insert({1, "Red"});
myMultimap.insert({2, "Green"});
myMultimap.insert({1, "Blue"}); // 键1已存在,但会插入新元素
myMultimap.insert({1, "Yellow"}); // 键1已存在,再次插入新元素
std::cout << "std::multimap 键1的所有值:" << std::endl;
auto range = myMultimap.equal_range(1);
for (auto it = range.first; it != range.second; ++it) {
std::cout << " " << it->second << std::endl;
}
// 预期输出:
// Red
// Blue
// Yellow (顺序可能因插入顺序和底层实现而异,但都会被保留)
// 尝试在 multimap 上使用 operator[] 会导致编译错误
// myMultimap[1] = "Purple"; // 错误: no operator "[]" matches these operands
return 0;
}这个例子清楚地展示了
map
operator[]
multimap
equal_range
map
multimap
operator[]
std::map
std::multimap
选择
std::map
std::map<UserID, UserProfile>
std::map
operator[]
wordCounts[word]++;
std::map
insert
operator[]
std::map
std::multimap
multimap
multimap
map
multimap
map
简单来说,如果你的数据是“一对一”的关系,并且你重视键的唯一性和
operator[]
std::map
std::multimap
std::multimap
std::multimap
std::multimap<Timestamp, LogEntry>
multimap
std::multimap<StudentID, CourseID>
std::multimap<CourseID, StudentID>
std::multimap<Keyword, DocumentID>
std::multimap<NodeID, NeighborNodeID>
multimap
std::multimap
这些场景的核心共同点是:数据的逻辑模型允许或要求键的重复性,并且你需要能够方便地访问与某个键关联的所有值。
multimap
map
从理论的算法复杂度角度来看,
std::multimap
std::map
插入 (Insert) 操作:
std::map::insert()
O(logN)
std::map::operator[]
O(logN)
std::multimap::insert()
O(logN)
查找 (Find) 操作:
std::map::find(key)
O(logN)
std::multimap::find(key)
O(logN)
std::multimap::equal_range(key)
O(logN)
k
O(logN + k)
k
删除 (Erase) 操作:
std::map::erase(key)
O(logN)
std::multimap::erase(key)
O(logN + k)
k
erase(iterator)
O(1)
O(logN)
遍历 (Iteration) 操作:
O(N)
N
异同点总结:
O(logN)
multimap
+k
k
multimap
map<Key, vector<Value>>
vector
vector
multimap
operator[]
multimap
operator[]
find
insert
总的来说
以上就是C++STL multimap与map使用区别的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号