【问题标题】:Is there a alternative or a version of linked hashmap on c++?c++ 中是否有替代或版本的linkedhashmap?
【发布时间】:2020-03-22 08:42:41
【问题描述】:

我的任务是将项目从 java 转换为 c++,我一直在尝试转换下面的代码。目前,该项目是一个网络scraper,所以我设法从网站上抓取数据并将其存储在向量中。在 C++ 中,现在我在向量中有“月”数据,我想将每个月的计数存储在链接的哈希图中。但是,我似乎找不到链接哈希图的 C++ 版本。我有什么想法可以将下面的代码转换为 C++ 吗?

LinkedHashMap<String, Integer> numberOfPost = new LinkedHashMap<String, Integer>();
int janCounter = 0;
int febCounter = 0;
int marCounter = 0;
int aprCounter = 0;
int mayCounter = 0;
int juneCounter = 0;
int julyCounter = 0;
int augCounter = 0;
int septCounter = 0;
int octCounter = 0;
int novCounter = 0;
int decCounter = 0; 
String pattern = "MMM";
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
ArrayList<?> STArray;
try {
    STArray = this.data;
    Iterator STitr = STArray.iterator();
    while (STitr.hasNext()) {
        STPost St = (STPost) STitr.next();
        Date retrievedate = St.getTime();
        String strDate = sdf.format(retrievedate);
        if(strDate.equals("Jan")) {
            janCounter++;
        }
        else if (strDate.equals("Feb")) {
            febCounter++;
        }
        else if (strDate.equals("Mar")) {
            marCounter++;
        }
        else if (strDate.equals("Apr")) {
            aprCounter++;
        }
        else if (strDate.equals("May")) {
            mayCounter++;
        }
        else if (strDate.equals("June")) {
            juneCounter++;
        }
        else if (strDate.equals("July")) {
            julyCounter++;
        }
        else if (strDate.equals("Aug")) {
            augCounter++;
        }
        else if (strDate.equals("Sept")) {
            septCounter++;
        }
        else if (strDate.equals("Oct")) {
            octCounter++;
        }
        else if (strDate.equals("Nov")) {
            novCounter++;
        }
        else if (strDate.equals("Dec")) {
            decCounter++;
        }
        numberOfPost.put("December", decCounter);
        numberOfPost.put("January", janCounter);
        numberOfPost.put("Feburary", febCounter);
        numberOfPost.put("March", marCounter);
        numberOfPost.put("April", aprCounter);
        numberOfPost.put("May", mayCounter);
        numberOfPost.put("June", juneCounter);
        numberOfPost.put("July", julyCounter);
        numberOfPost.put("August", augCounter);
        numberOfPost.put("September", septCounter);
        numberOfPost.put("October", octCounter);
        numberOfPost.put("November", novCounter);
    }
} catch (ParseException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

【问题讨论】:

  • 也许这个answer可以帮助你。
  • 我认为 std::map 正是你需要的en.cppreference.com/w/cpp/container/map
  • 这段代码需要DRYer
  • 您好,感谢 stdLLmap 似乎有很大帮助,但它不会打印在订单中。目前它正在打印 feburary, janurary, March 而不是 january,feburary,march

标签: c++


【解决方案1】:

标准中没有这样的东西。但我找到了一种实现方式:

linked_map

我无法翻译所有内容,但我认为它会有所帮助

    cxxext::linked_map<std::string, int> numberOfPost;

    int janCounter = 0;
    int febCounter = 0;
    int marCounter = 0;
    int aprCounter = 0;
    int mayCounter = 0;
    int juneCounter = 0;
    int julyCounter = 0;
    int augCounter = 0;
    int septCounter = 0;
    int octCounter = 0;
    int novCounter = 0;
    int decCounter = 0;

    try {
        auto STArray & = this->data;
        for (auto val : STArray) {
            STPost St = static_cast<STPost>(val);
            Date retrievedate = St.getTime();
            std::string strDate = sdf.format(retrievedate);
            if (strDate = "Jan") {
                janCounter++;
            }
            else if (strDate == "Feb") {
                febCounter++;
            }
            else if (strDate == "Mar") {
                marCounter++;
            }
            else if (strDate == "Apr") {
                aprCounter++;
            }
            else if (strDate == "May") {
                mayCounter++;
            }
            else if (strDate == "June") {
                juneCounter++;
            }
            else if (strDate == "July") {
                julyCounter++;
            }
            else if (strDate == "Aug") {
                augCounter++;
            }
            else if (strDate == "ept") {
                septCounter++;
            }
            else if (strDate == "Oct") {
                octCounter++;
            }
            else if (strDate == "Nov") {
                novCounter++;
            }
            else if (strDate == "Dec") {
                decCounter++;
            }
            numberOfPost.insert({ "December", decCounter });
            numberOfPost.insert({ "January", janCounter });
            numberOfPost.insert({ "Feburary", febCounter });
            numberOfPost.insert({ "March", marCounter });
            numberOfPost.insert({ "April", aprCounter });
            numberOfPost.insert({ "May", mayCounter });
            numberOfPost.insert({ "June", juneCounter });
            numberOfPost.insert({ "July", julyCounter });
            numberOfPost.insert({ "August", augCounter });
            numberOfPost.insert({ "eptember", septCounter });
            numberOfPost.insert({ "October", octCounter });
            numberOfPost.insert({ "November", novCounter });
        }
    }
    catch (const ParseException & e) {
        // TODO Auto-generated catch block
        e.what();
    }

【讨论】:

  • 您好,感谢您的代码。请问linked_map和普通贴图有什么区别?两者对我来说似乎都一样?
  • 您好,“linked_map”、“std::map”和“std::unordered_map”的主要区别在于“linked_map”维护了键的插入顺序,即键的顺序插入“linked_map”。另一方面,默认情况下,“map”按递增顺序对键进行排序,“unordered_map”不维护任何顺序或键或值。本质上,“linked_map”是 Java 的“linked hashmap”的一种模拟。
  • 好的,所以我假设它是一个库,我需要将它导入到 Visual Studio 中?
  • 谢谢,我已经下载了库并包含在我的项目中,它似乎从一月到十二月打印出来,这正是我想要的。
猜你喜欢
  • 2021-12-24
  • 1970-01-01
  • 2011-10-18
  • 1970-01-01
  • 2014-05-25
  • 2015-10-18
  • 2019-03-21
  • 1970-01-01
  • 2022-01-20
相关资源
最近更新 更多