C ++在地图中删除地图中的元素

C++ removing element in map in map

我有这个程序,我在这个程序中以这种形式将值存储在地图中。

map<string, map<int, CItem, cmpByCnt>> m_Items;

因此,如果我有两个同名的项目,我会将它们保存到“子图”。例如,这里我有:

map: {
       key: beer map: {key: date: 1470783661 count: 50}
       key: bread map {key: date: 1461538861 count: 0, key: date: 1461970861 count: 80}
     }

如何在这个子图中删除?

  1. 例如,如果key (date) 1461538861 with count = 0 删除子图中的这条记录。但我想保留密钥:日期:1461970861 计数:80

所以我得到

map: {
           key: beer map: {key: date: 1470783661 count: 50}
           key: bread map {key: date: 1461970861 count: 80}
         }
  1. 如果我想在外键的基础上删除,这里:啤酒,所以我也会删除外键

所以我得到

map: {
               key: bread map {key: date: 1461970861 count: 80}
             }

也许我至少有点了解。感谢您的所有评论。完成节目 https://onecompiler.com/cpp/3xzqq36xf

class CSupermarket
{
    public:
        CSupermarket();
        CSupermarket& store(const string &name,const CDate &date,const int &cnt);
        map<string, map<int, CItem, cmpByCnt>> m_Items;
};
CSupermarket& CSupermarket::store(const string &name,const CDate &date,const int &cnt)
{
    CItem a(name, date, cnt);
    auto itr = m_Items.find(name);
    if ( itr != m_Items.end())
        itr->second.emplace(a.m_Date.m_Time, a);
    else
        m_Items.emplace(name, std::map<int, CItem, cmpByCnt>{{a.m_Date.m_Time, a}});
    return *this;
}
int main()
{
    CSupermarket s;
  s . store ( "bread", CDate ( 2016, 4, 30 ), 100 )
    . store ( "butter", CDate ( 2016, 5, 10 ), 10 )
    . store ( "beer", CDate ( 2016, 8, 10 ), 50 )
    . store ( "bread", CDate ( 2016, 4, 25 ), 100 )
    . store ( "okey", CDate ( 2016, 7, 18 ), 5 );

// print
        for(auto itr = s.m_Items.begin(); itr != s.m_Items.end(); ++itr)
        {
            cout << itr->first << " ";
            for(auto i = itr->second.begin(); i != itr->second.end(); ++i)
            {
                cout << " date: " << i->first << " count: " << i->second.m_Cnt;
            }
            cout << endl;
        }
    }

从二维地图中删除元素与从一维地图中删除元素几乎相同。你只想在内部地图上调用.erase

假设你有一张一维地图:

std::map<int, std::string> m = {
    {1, "one" }, {2, "two" }, {3, "three"},
    {4, "four"}, {5, "five"}, {6, "six"  }
};

要删除 {3, "three"},您只需执行以下操作:

m.erase(3);

现在,如果您有 2d 地图:

std::map<int, std::map<std::string, std::string>> m = {
    {1, {{"en", "one"}, {"es", "uno"}}},
    {2, {{"en", "two"}, {"es", "dos"}}},
    {3, {{"en", "three"}, {"es", "tres"}}},
    {4, {{"en", "four"}, {"es", "cuatro"}}},
};

要访问内部地图,您可以这样做:

m[1];

现在,如果您想从中删除 {"en", "one"},只需执行以下操作:

m[1].erase("en");

如果你想删除整个内部地图之一,你会这样做:

m.erase(3);

演示:https://godbolt.org/z/aqzGTfc37


需要注意的一点是,删除内部地图的所有元素不会自动从外部地图中删除该内部地图。要删除所有空的内部地图,您可以这样做:

std::erase_if(m, [](auto& item){
    auto& [number, inner_map] = item;
    return inner_map.size() == 0;
});

演示:https://godbolt.org/z/hMhMd8Y7b


对于 C++17 及更早版本,map 没有 erase_if 函数,因此您可以执行以下操作:

for(auto it = m.begin(); it != m.end();)
{
    if(it->second.size() == 0)
    {
        it = m.erase(it);
    }
    else ++it;
}

演示:https://godbolt.org/z/aTvPGGT8K