簡體   English   中英

如何通過映射中包含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_algo.h:150:錯誤:無法轉換' __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 << "\nafter\n\n";
    for (auto const &p : myMap)
        std::cout << p.first << ": " << p.second << "\n";

}

我會用一個簡單的循環來做到這一點。 從地圖上刪除元素時,您需要記住要跟蹤迭代器:

#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}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM