在c ++ stl map中,删除具有重复值的条目

时间:2018-05-16 09:10:32

标签: c++ dictionary stl

考虑地图mymap有条目

public class DataAccessAttribute: ActionFilterAttribute
{
    public bool Disable { get; set; }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (Disable) return;

        // Your original logic for your 95% actions goes here.
    }
}

依旧......
如何删除地图中重复值的条目。
例如键'a'和'e'存在值111。因此,请保留“a”的地图条目并删除“e”的条目 对于值222,保留条目“d”并删除条目“f”和“h” 我正在寻找具有最佳空间和时间复杂度的解决方案

3 个答案:

答案 0 :(得分:2)

你可能想要这样的东西:

#include <iostream>
#include <map>
#include <set>

int main() {
  std::map<char, int> mymap
  {
    {'a', 111}, {'b', 567}, {'c', 956}, {'d', 222}, 
    {'e', 111}, {'f', 222}, {'h', 222}, {'i', 492},
  };

  std::set<int> existingvalues;

  for (auto it = mymap.begin(); it != mymap.end(); it++)
  {
    if (existingvalues.find(it->second) != existingvalues.end())
      mymap.erase(it--);                  // value already encountered => remove entry
    else
      existingvalues.insert(it->second);  // value not yet encountered => remeber it
  }

  for (auto it = mymap.begin(); it != mymap.end(); it++)
    std::cout << "<'" << it->first << "', " << it->second << ">\n";
}

答案 1 :(得分:2)

这是一个有趣的问题,如果有点偏离主题。

因为你的地图的值是可混合的和相等的,所以我们可以在线性时间内做这个,使用<?php try{ $connect = mysqli_connect("localhost", "root", "", "mytest"); $query = ''; $table_data = ''; $filename = "path.json"; $data = file_get_contents($filename); $array = json_decode($data, true); foreach($array as $row) { $query .= "INSERT INTO tbl_sales(sale_item, sale_qty, row_inserted_on, last_edited_on, id) VALUES ('".$row["sale_item"]."', '".$row["sale_qty"]."', '".$row["row_inserted_on"]."', '".$row["last_edited_on"]."', '".$row["id"]."') ON DUPLICATE KEY UPDATE sale_item='".$row["sale_item"]."', sale_qty='".$row["sale_qty"]."', row_inserted_on='".$row["row_inserted_on"]."', last_edited_on='".$row["last_edited_on"]."';"; } mysqli_multi_query($connect, $query); echo "<h1>All data appeded </h1>"; } catch(Exception $e){ echo $e->getMessage(); } ?> 来确定之前是否看到了这个值:

此代码为c ++ 17:

unordered_set

答案 2 :(得分:1)

这是另一个可能的解决方案,涉及迭代地图容器2次,如果有重复值,第二次将有更少的元素迭代:

@RealmModule(fieldNamingPolicy

演示:https://ideone.com/oThy17

#include <iostream> 
#include <algorithm>
#include <map>

template <typename T, typename U>
void RemoveDuplicateValues(std::map<T, U> &m)
{
    std::map<U, T> tmp;
    std::for_each(m.rbegin(), m.rend(), [&tmp](auto const &p)
    {
        tmp[p.second] = p.first;
    });

    m.clear();
    for (auto const &p : tmp)
        m[p.second] = p.first;
}

int main()
{
    std::map<char, int> m
    {
        { 'a', 111 },{ 'b', 567 },{ 'c', 956 },{ 'd', 222 },
        { 'e', 111 },{ 'f', 222 },{ 'h', 222 },{ 'i', 492 }
    };

    RemoveDuplicateValues(m);

    // test
    for (auto const &p : m)
        std::cout << p.first << " " << p.second << std::endl;

    return 0;
}