【问题标题】:Is there any inbuilt hashmap function to handle input by values in c++?是否有任何内置的 hashmap 函数来处理 c++ 中的值输入?
【发布时间】:2019-11-23 15:49:34
【问题描述】:

这是我输入的txt文档:

Hello A:1
World A:1
Hello A:2
World A:2
Hello B:1
World B:2
Hello C:4

我尝试在 hashmap 中像循环 hashmap 一样使用它对我没有帮助。这是我的哈希表的键和值:

String word,word1,word2,word3,word4; // for example word1 is Hello, word2 is A:1
size_t sub1;
word = word1 + word2;   
sub1 = word.find(":");
word3 = word.substr(0,sub1+1); //word3 = "Hello A" which is my key for internal hash function 
word4 = word.substr(sub1+1,word.length()); //word4 = 1,2 which is word3's value.

您知道我可以使用哪个内置函数来获得此输出吗?

Hello A:1,2 B:1 C:4
World A:1,2 B:2

显然有更好的解决方案,如果您能给我一些想法,最好是一些代码,我将不胜感激?

【问题讨论】:

  • 你在寻找std::unordered_map吗?
  • 如果输出顺序很重要,哈希表就不会这样做,因为它不一定是有序的。从您的输入数据填充的std::map<std::string, std::map<std::string, std::set<int>>> 可能会满足您的需求。如果顺序不重要。即 World 可以在 Hello 之前,B 可以在 A 之前,和/或 2 可以在 1 之前,然后可以使用 unordered_map 和 unordered_set 代替。无论哪种方式,集合地图的地图都会/应该做你想要的。
  • 我无法将地图用作另一张地图中的钥匙 :( 感谢您的帮助

标签: c++ hashmap hashtable


【解决方案1】:

假设冒号前的字符始终是 A-Z 之间的单个大写字符,并且输出行的顺序并不重要,您可以使用此解决方案。

int main() {
  std::unordered_map<std::string, std::vector<std::string>> mmap;
  std::string line;
  std::stringstream stream;
  while (std::getline(file, line)) {
    stream.str(line);
    std::string word;
    stream >> word;
    if (mmap.find(word) == mmap.end()) {
      mmap[word] = std::vector<std::string>(26);
    }
    char letter, sep;
    int num;
    stream >> letter >> sep >> num;
    std::string& entry = mmap[word][letter - 'A'];
    if (entry.empty())
      entry += std::to_string(num);
    else
      entry += "#" + std::to_string(num);
    stream.clear();
  }

  for (auto const& [word, record] : mmap) {
    std::cout << word << " ";
    const char* sep1 = "";
    for (size_t i = 0; i < record.size(); i++) {
      if (!record[i].empty()) {
        std::cout << sep1 << char(i + 'A') << ":";
        stream.str(record[i]);
        char const* sep2 = "";
        std::string num;
        while (std::getline(stream, num, '#')) {
          std::cout << sep2 << num;
          sep2 = ",";
        }
        sep1 = " ";
      }
      stream.clear();
      stream.str("");
    }
    std::cout << std::endl;
  }
}

如果顺序很重要,您只需将unordered_map 更改为map

【讨论】:

  • 你为什么用字母 - 'A' ?在向量<:string>(26);向量的大小是 26 吗?
  • 是的,26 是向量的大小。当您想将单个字母字符映射到其他对象时,一种巧妙的方法是创建一个具有字母长度的数组。执行array[letter - 'A'] 将访问代表字母letter 的插槽。 C++ 中的字符使用 ASCII 表,其中字母在内部表示为数字。包括字母在内的所有字符都可以用作数字,所以letter - 'A' 其中letter == 'A' 使'A' - 'A' 为0,然后如果letter == 'B' 为'1' 等等。
  • 如果我想使用字符串而不是字母。我应该如何实施呢?你好 str:1 而不是 Hello A:1
  • @CarlosErmani 而不是vector&lt;string&gt;,您可以使用unordered_map&lt;string, string&gt; 并进行更多修改。
  • unordered_mapmap 如果您关心订单。
猜你喜欢
  • 2022-08-17
  • 1970-01-01
  • 2019-04-12
  • 2012-09-19
  • 1970-01-01
  • 2022-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多