stdmap 相关问题

std :: map是C ++标准库中的一个类。它是一个已排序的关联容器,包含具有唯一键的键值对。搜索,删除和插入操作具有对数复杂性。地图通常实现为红黑树。

如何查找给定的键是否存在于 std::map 中

我正在尝试检查给定的键是否在地图中,但有些无法做到: typedef 映射::迭代器 mi; 地图米; m.insert(make_pair("f","++--")); 一对 我正在尝试检查给定的键是否在地图中,但有些做不到: typedef map<string,string>::iterator mi; map<string, string> m; m.insert(make_pair("f","++--")); pair<mi,mi> p = m.equal_range("f");//I'm not sure if equal_range does what I want cout << p.first;//I'm getting error here 那么我怎样才能打印p中的内容呢? 使用 map::find 和 map::end: if (m.find("f") == m.end()) { // not found } else { // found } 要检查映射中是否存在特定键,请通过以下方式之一使用 count 成员函数: m.count(key) > 0 m.count(key) == 1 m.count(key) != 0 map::find的文档说:“另一个成员函数map::count可用于仅检查特定键是否存在。” map::count的文档说:“因为地图容器中的所有元素都是唯一的,所以该函数只能返回1(如果找到该元素)或零(否则)。” 要通过您知道存在的键从映射中检索值,请使用 map::at: value = m.at(key) 与 map::operator[] 不同,如果指定的键不存在,map::at 不会在映射中创建新键。 C++20 为我们提供了 std::map::contains 来做到这一点。 #include <iostream> #include <string> #include <map> int main() { std::map<int, std::string> example = {{1, "One"}, {2, "Two"}, {3, "Three"}, {42, "Don\'t Panic!!!"}}; if(example.contains(42)) { std::cout << "Found\n"; } else { std::cout << "Not found\n"; } } 您可以使用.find(): map<string,string>::iterator i = m.find("f"); if (i == m.end()) { /* Not found */ } else { /* Found, i->first is f, i->second is ++-- */ } C++17 通过带有初始化器的 If 语句进一步简化了这一点。 这样你就可以鱼与熊掌兼得了。 if ( auto it{ m.find( "key" ) }; it != std::end( m ) ) { // Use `structured binding` to get the key // and value. const auto&[ key, value ] { *it }; // Grab either the key or value stored in the pair. // The key is stored in the 'first' variable and // the 'value' is stored in the second. const auto& mkey{ it->first }; const auto& mvalue{ it->second }; // That or just grab the entire pair pointed // to by the iterator. const auto& pair{ *it }; } else { // Key was not found.. } m.find == m.end() // not found 如果您想使用其他API,请找到m.count(c)>0 if (m.count("f")>0) cout << " is an element of m.\n"; else cout << " is not an element of m.\n"; 我想你想要map::find。如果 m.find("f") 等于 m.end(),则未找到密钥。否则,find 返回一个指向找到的元素的迭代器。 错误是因为p.first是一个迭代器,它不适用于流插入。将最后一行更改为 cout << (p.first)->first;。 p 是一对迭代器,p.first 是迭代器,p.first->first 是键字符串。 一张地图对于给定的键只能有一个元素,所以 equal_range 不是很有用。它是为映射定义的,因为它是为所有关联容器定义的,但它对于多重映射更有趣。 template <typename T, typename Key> bool key_exists(const T& container, const Key& key) { return (container.find(key) != std::end(container)); } 当然,如果你想变得更奇特,你可以随时模板化一个函数,该函数也采用已找到的函数和未找到的函数,如下所示: template <typename T, typename Key, typename FoundFunction, typename NotFoundFunction> void find_and_execute(const T& container, const Key& key, FoundFunction found_function, NotFoundFunction not_found_function) { auto& it = container.find(key); if (it != std::end(container)) { found_function(key, it->second); } else { not_found_function(key); } } 并像这样使用它: std::map<int, int> some_map; find_and_execute(some_map, 1, [](int key, int value){ std::cout << "key " << key << " found, value: " << value << std::endl; }, [](int key){ std::cout << "key " << key << " not found" << std::endl; }); 这样做的缺点是想出一个好名字,“find_and_execute”很尴尬,我想不出更好的名字...... map<string, string> m; 检查 key 是否存在,并返回出现次数(map 中为 0/1): int num = m.count("f"); if (num>0) { //found } else { // not found } 检查key是否存在,并返回迭代器: map<string,string>::iterator mi = m.find("f"); if(mi != m.end()) { //found //do something to mi. } else { // not found } 在你的问题中,由坏的operator<<过载引起的错误,因为p.first是map<string, string>,你无法打印出来。尝试这个: if(p.first != p.second) { cout << p.first->first << " " << p.first->second << endl; } 小心地将查找结果与地图“m”的结尾进行比较,因为所有答案都有 上面完成 地图::迭代器 i = m.find("f"); if (i == m.end()) { } else { } 您不应该尝试执行任何操作,例如如果迭代器 i 等于 m.end() 则打印键或值,否则会导致分段错误。 比较 std::map::find 和 std::map::count 的代码,我认为第一个可能会产生一些性能优势: const_iterator find(const key_type& _Keyval) const { // find an element in nonmutable sequence that matches _Keyval const_iterator _Where = lower_bound(_Keyval); // Here one looks only for lower bound return (_Where == end() || _DEBUG_LT_PRED(this->_Getcomp(), _Keyval, this->_Key(_Where._Mynode())) ? end() : _Where); } size_type count(const key_type& _Keyval) const { // count all elements that match _Keyval _Paircc _Ans = equal_range(_Keyval); // Here both lower and upper bounds are to be found, which is presumably slower. size_type _Num = 0; _Distance(_Ans.first, _Ans.second, _Num); return (_Num); } find() 和 contains() 都可以使用。根据文档。两种方法平均时间为常数,最坏情况下为线性时间。 我知道这个问题已经有一些很好的答案,但我认为我的解决方案值得分享。 它适用于 std::map 和 std::vector<std::pair<T, U>>,并且可从 C++11 开始使用。 template <typename ForwardIterator, typename Key> bool contains_key(ForwardIterator first, ForwardIterator last, Key const key) { using ValueType = typename std::iterator_traits<ForwardIterator>::value_type; auto search_result = std::find_if( first, last, [&key](ValueType const& item) { return item.first == key; } ); if (search_result == last) { return false; } else { return true; } } map <int , char>::iterator itr; for(itr = MyMap.begin() ; itr!= MyMap.end() ; itr++) { if (itr->second == 'c') { cout<<itr->first<<endl; } } 如果你想比较成对的地图,你可以使用这个方法: typedef map<double, double> TestMap; TestMap testMap; pair<map<double,double>::iterator,bool> controlMapValues; controlMapValues= testMap.insert(std::pair<double,double>(x,y)); if (controlMapValues.second == false ) { TestMap::iterator it; it = testMap.find(x); if (it->second == y) { cout<<"Given value is already exist in Map"<<endl; } } 这是一项有用的技术。

回答 15 投票 0

如何循环遍历 std::map?

我想迭代映射中的每个元素,而不知道其任何 string-int 值或键。 到目前为止我所拥有的: 无效输出(地图表) { 我...

回答 8 投票 0

如何迭代 std::map 的键?

我正在寻找一种在C ++ 17中迭代映射的键的方法。我现在想到的方法是基于这个问题的答案,该方法如下所示。 对于(自动常量&am...

回答 6 投票 0

迭代 std::variant 的映射

我正在尝试使用 C++17 的 std::variant 在映射中存储多种类型的数据。这里的用例是拥有一个我可以迭代的泛型类型控制器的映射(但受 std::variant 约束)

回答 2 投票 0

为什么我无法在 const std::map 中使用运算符[]访问元素?

我尝试使用operator[]访问const映射中的元素,但是这个方法失败了。我也尝试使用 at() 来做同样的事情。这次成功了。但是,我找不到任何参考...

回答 4 投票 0

如果不存在,我可以依靠 std::map::operator[] 创建默认键/值对,或者可以优化 map[...] 吗?

我有一个 C++ 程序,我想在其中插入 std::map 中缺少的任何键的默认值。我认为最简单的方法是使用 std::map::operator[]() 像 POSIX touch

回答 3 投票 0

节点句柄 vs std::unique_ptr

阅读节点句柄的文档,我注意到节点句柄类型的许多功能可以简单地通过 std::unique_ptr 的专门化来模拟。事实上,...

回答 1 投票 0

C++ 中的简单 FizzBuzz 程序出现意外输出

我只是尝试实现一个简单的 FizzBuzz 程序,其中我试图将规则集与逻辑分开,这是我在编译器资源管理器中执行此操作的尝试,没有使用...

回答 1 投票 0

什么时候应该使用 std::map / std::set 而不是 std::unordered_map / std::unordered_set?

C++11 标准引入了 std::unordered_map 和 std::unordered_set,它们使用哈希函数并具有(平均)恒定的插入/删除/获取元素的复杂性。 如果...

回答 3 投票 0

std::map::iterator 返回值的副本还是值本身?

我正在尝试在地图中创建地图: typedef 映射 inside_map; typedef 映射 外层映射; 我可以在内部映射中放入一些东西吗,或者迭代器::

回答 5 投票 0

静态 std::map 成员变量在 C++ 中安全吗?

假设我想实现一种查找表作为std::map,例如: // Utils.hpp 标头 实用工具类 { 民众: 静态 std::map Na...

回答 1 投票 0

如何将 std::map 序列化到文件?

我有一个 std::map,其中: struct customType { // 示例结构 std::字符串a; std::字符串b; 整数c; std::list d; } 我怎样才能连载这个...

回答 6 投票 0

理解 std::map 中的shared_ptr<void>的使用问题

我有以下代码: #包括 #包括 #包括 #包括 #包括 使用命名空间 std; typedef std::map 我有以下代码: #include <iostream> #include <vector> #include <string> #include <map> #include <sstream> using namespace std; typedef std::map<std::string, std::shared_ptr<void>> M; typedef std::vector<std::string> S; void build_word_tree_from_sentences(const S& sentence_list, M& root) { for (const auto& sentence : sentence_list) { std::string word; std::stringstream ss(sentence); M* base = &root; while (ss >> word) { auto found = base->find(word); if (found == base->end()) { base->insert(std::make_pair(word, std::make_shared<M>())); } auto b = base->find(word)->second; base = std::static_pointer_cast<M>(b).get(); } } } int main() { S sentence_list = {"Hello word", "Hello there"}; M tree; build_word_tree_from_sentences(sentence_list, tree); } 我希望能帮助您理解map M 中shared_ptr 的使用。 在地图中插入新元素(如果尚不存在)时: base->insert(std::make_pair(word, std::make_shared<M>())); 使用空参数调用shared_ptr,这也让我感到困惑。 我在互联网上搜索信息,但没有找到任何相关内容 M tree; 只是默认结构。 那个 std::shared_pointer<..., void> 是一条红鲱鱼。共享指针将包含 std::make_shared 创建的共享对象的删除器(~std::map<...>)。当然,该函数会构建一棵地图树。

回答 1 投票 0

如何使用相反的签名坐标键初始化 std::map ?

对于一些背景信息,我正在尝试使用字典查找创建快速四叉树生成算法。基本概念涉及通过二进制将坐标映射到四叉树节点

回答 1 投票 0

以结构体为键列出 std::map 的初始化

我目前有这个: 结构体 Foo { 整数值=12; Foo(int a) : 值(a) {} }; 我正在尝试这样做: std::map m{ {{1}, 2} }; 为什么上面给出编译

回答 1 投票 0

约束嵌套 std::map 的键和值内部类型

最初,我想将嵌套的 std::vector 的内部类型限制为 int 或 std::string。我能够使用 C++20 的概念和以下堆栈来实现这一目标...

回答 2 投票 0

约束 std::map 的键和值内部类型

最初,我想限制 std::vector 的内部类型,例如 int 或 std::string。我能够使用 C++20 的概念来实现这一目标: // 获取最内层类型的特征

回答 1 投票 0

处理 std::map 内的 unique_ptr<pure_virtual_class> 向量时出现意外编译错误

#包括 #包括 #包括 #包括 基类{ 民众: 虚拟 ~Base() = 默认值; 虚拟无效 doIt() = 0; 民众: int 基数 =...

回答 1 投票 0

我们可以通过提供提示来优化 `std::map::find` 的性能吗?

方法 std::map::emplace_hint 允许我们通过提供一个“提示”迭代器来优化 std::map::emplace 的性能,我们希望它非常接近项目所在的位置...

回答 1 投票 0

给定一个(非开始())起始键,有没有办法在地图中找到下一个键?

我有一个 std::map 用于实现解释语言的符号表。这正在替换仅使用打包字符串的旧实现...

回答 0 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.