如何在map中按键删除元素,其中包含char和pair<int,string>
How to delete elements by key in map, which contains char and pair<int,string>
我要删除所有先配对的元素== 0
下面代码:
int main()
{
map<char, pair<int,string>> myMap;
map<char, pair<int,string>>::const_iterator it;
for (int i = 0; i < 10; i++)
{
char c = 'a' + i;
pair<int,string> p = make_pair(rand() % 2, "dd");
myMap.insert(make_pair(c,p));
}
it = find_if(myMap.begin, myMap.end(), isEqual);
}
bool isEqual(const pair<char, pair<int, string> > element)
{
return element.second.first == 0;
}
错误:
/usr/include/c++/4.8/bits/stl_algorithm .h:150: error: could not convert'
__first.std::_Rb_tree_iterator<_Tp>::operator*<std::pair<const char, std::pair<int, std::basic_string<char> > > >()
'从'std::pair<const char, std::pair<int, std::basic_string<char> > >
'到'std::pair<int, std::basic_string<char> >
'while (__first != __last && !bool(__pred(*__first)))
当然可以。
我想我会这样写代码(我添加了一些额外的代码来打印出删除前后的映射内容,以表明它有效):
#include <map>
#include <utility>
#include <iostream>
#include <stdlib.h>
#include <string>
#include <algorithm>
#include <iterator>
#include <vector>
using namespace std;
ostream &operator<<(ostream &os, pair<int, string> const &p) {
return os << "[" << p.first << ", " << p.second << "]";
}
int main() {
map<char, pair<int, string>> myMap;
for (int i = 0; i < 10; i++) {
char c = 'a' + i;
pair<int, string> p = make_pair(rand() % 2, "dd");
myMap.insert(make_pair(c, p));
}
std::cout << "before:n";
for (auto const &p : myMap)
std::cout << p.first << ": " << p.second << "n";
map<char, pair<int, string> >::iterator it;
while (myMap.end() != (it = find_if(myMap.begin(), myMap.end(), [](auto p) { return p.second.first == 0; })))
myMap.erase(it);
std::cout << "nafternn";
for (auto const &p : myMap)
std::cout << p.first << ": " << p.second << "n";
}
我将使用一个简单的循环来实现这一点。当从map中擦除元素时,需要记住跟踪迭代器:
#include <map>
#include <ctime>
#include <string>
#include <vector>
#include <cstdlib>
#include <iostream>
#include <algorithm>
int main()
{
std::srand(std::time(0));
std::map<char, std::pair<int, std::string>> myMap;
for(int i = 0; i < 10; i++)
{
char c = 'a' + i;
auto p = std::make_pair(rand() % 2, "dd");
myMap.insert(std::make_pair(c, p));
}
std::cout << "nbefore:n";
for(auto const& p: myMap)
{
std::cout << p.first;
std::cout << " {" << p.second.first;
std::cout << ", " << p.second.second;
std::cout << "}" << 'n';
}
// remove items in a simple loop
for(auto iter = myMap.begin(); iter != myMap.end();)
{
if(iter->second.first == 0)
iter = myMap.erase(iter); // grab new iterator when erasing
else
++iter; // otherwise just increment
}
std::cout << "nafter:n";
for(auto const& p: myMap)
{
std::cout << p.first;
std::cout << " {" << p.second.first;
std::cout << ", " << p.second.second;
std::cout << "}" << 'n';
}
}
示例输出:
before:
a {0, dd}
b {1, dd}
c {0, dd}
d {0, dd}
e {1, dd}
f {0, dd}
g {0, dd}
h {1, dd}
i {0, dd}
j {0, dd}
after:
b {1, dd}
e {1, dd}
h {1, dd}
相关文章:
- 是否需要删除包含对象的"pair"?
- EASTL矢量<向量<int>>连续的
- 在我的代码中,获得最大的Pair Wise产品C++和输出并不总是正确的
- 为什么大多数 pair 实现默认不使用压缩(空基优化)?
- 对 pair<pair<int,int>pair<int,int unordered_map进行哈希处理>>
- 对的排序向量 (std::vector<pair<int, int>>) 按对的第一个元素搜索并更新第二个元素值
- 删除字符串中具有相同值的任何相邻字母"pair"
- 当我尝试定义这个向量时<pair<int , pair<int, int> > > vp(n)
- 如何从map<pair<string,int>,pair<string,Array>>中迭代和查找?
- ostream_iterator运算符=在pair<int,int>上失败,但在包装器类上工作。我不能为成对<>重载运算符<<吗?
- c++:在switch中使用std::pair的可能性
- 为什么 pair 在初始化中不需要类型
- 将从std::映射中获取的std::pair引用传递给接受std::对引用的函数
- pair的两个构造函数几乎相同,为什么不生成构建错误?
- 如何在一对集合的向量中插入元素?vector<pair<int,set<string>>>
- Hash for a std::pair, for use in an unordered_map
- 使用 pair<int、int> 或字符串作为 map<> 键,哪个更有效?
- 如何使用set<pair<int,int> >::iterator itrator it迭代set<pair<int,int> >st中的值?
- map<int,int>的*迭代器是什么?它不是pair<int,int>
- 在 c++ 中的 multiset<pair<int,int> > 中查找下限