在 C++ 中将唯一字符串转换为唯一整数值

Posted

技术标签:

【中文标题】在 C++ 中将唯一字符串转换为唯一整数值【英文标题】:Convert Unique String to an unique integer value in C++ 【发布时间】:2020-04-17 08:47:49 【问题描述】:

在我的项目中,需要唯一标识字符串。我想知道是否有任何简单的方法来表示具有唯一整数值​​的唯一字符串。也许它与字符的 ASCII 值有关,但我不知道该怎么做。 例如:我希望字符串“ankit”以唯一值表示。这个唯一的整数值应该只代表字符串“ankit”。而且我还想将此唯一的 int 转换为与之关联的正确字符串。我希望你明白。如果没有你可以问。

最大字符串长度为 32。

举个例子:

假设我们有 4 个字符串。 "ankit" 的值为 5。下一个输入是"John",值为6。下一个输入是"ankit",其值为3,然后是"ankit",其值为3。所以我想要将相应字符串的累积总和存储在单个数组中各自出现的位置。

这里将创建一个大小为 n(字符串数)的数组。 arr[n] 它将存储arr[0]=5arr[1]=6arr[2]=8arr[3]=11

【问题讨论】:

使用标准库简单的方法,但无论如何我仍然试图了解你真正想要做什么。请添加一个示例,到目前为止您编写的任何代码都会有所帮助 字符串可以是任意大小。因此,要将任何字符串表示为整数,您还需要可以是任意大小的整数。 C++ 没有内置此功能,您需要第三方库,例如 MPIR 或 GMP。但我想你可能并不真的需要这个。请解释你真正想要做什么,也许有人可以提出比你目前正在尝试的更好的方法。 @AnkitMishra 但是哈希不是唯一的,它们不能被反转。你不能从散列回到字符串。请仔细解释你真正想要做什么,目前我们只是猜测。 你不需要哈希:std::unorderd_map<std::string, int> 是你可以使用的。 map["ankit"] += 5; map["John"] += 6; map["ankit"] += 3 【参考方案1】:

要将std::strings 映射到整数,您可以使用std::unordered_map<std::string,int>。如果你想将std::strings 映射到某个整数的累积和,那就是将std::unordered_map<std::string,std:::vector<int>> 包裹在一个辅助类中以实现累积和的逻辑:

#include <string>
#include <vector>
#include <iostream>
#include <unordered_map>


struct cumsummap 
    std::unordered_map<std::string,std::vector<int>> data;
    std::vector<int> history;
    void add(const std::string& key, int value) 
         auto& v = data[key];
         int sum = (v.size() == 0) ? value : v.back() + value;
         v.push_back(sum);
         history.push_back(sum);
    
    void print() 
        for (auto& p : data) 
            std::cout << p.first << " : ";
            for (auto& cumsum : p.second) std::cout << cumsum << " ";
            std::cout << '\n';
        
        for (auto& h : history) 
            std::cout << h << ' ';
        
    
;

int main()

    cumsummap c;
    c.add("ankit",5);
    c.add("john",6);
    c.add("ankit",3);
    c.add("ankit",3);
    c.print();

输出:

john : 6 
ankit : 5 8 11 
5 6 8 11 

注意:问题和答案经历了澄清的历史,因此当ints 的地图足以获得输出的最后一行时,会有一个矢量地图。

PS:请注意,不要混淆您想要解决的任务和您想到的解决方案的实施细节,这一点很重要。 “所以我想要将相应字符串的累积总和存储在单个数组中各自出现的位置。”这不是完全上述代码的作用。也没有可见的散列,没有唯一的整数,我不知道“[...]我想将这个唯一的 int 转换为与之关联的正确字符串”是什么意思。不过,我希望以上内容足够接近您真正想要做的事情。

PPS:“如果不使用 STL,就没有简单的方法吗?”我不得不再次提到,使用标准库 “简单的方法”。我没有受过编写自己的容器的培训,所以我仔细估计,在不使用标准库的情况下编写上述代码将超过 300 行代码,并且存在无数错误。

【讨论】:

我想保持插入元素的顺序。并且使用单个 DS。这样我就可以知道哪个值对应哪个字符串。在您的回答中,您首先插入了 Ankit,而不是 John,然后又插入了 Ankit 两次。所以顺序对我来说很重要。 @AnkitMishra 保留订单使用std::map 而不是std::unodered_map,对于第二条评论,我仍然不明白,对您的示例进行小修改将使您有两个相同的整数两个不同的字符串,为什么以及如何拥有唯一的整数? @AnkitMishra “单人使用单 DS”不知道这意味着什么 @AnkitMishra "ankit" 的值为 5。下一个输入是 "John" 的值为 6 .... 如果下一个插入是 "ankit" 的值为 1,那么会有一个条目总和为 6 的“ankit”,即你有 6 两次

以上是关于在 C++ 中将唯一字符串转换为唯一整数值的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中将 24 小时时间转换为整数值 [关闭]

字符串到唯一整数散列

如何在 SQL 中将指数和系数转换为整数值

sql server中的怎么把数值型转换为字符串

如何在python3.6中将字符串转换为唯一的整数,反之亦然(在0到255之间)

如何在颤动中将十六进制颜色代码解析为它们各自的整数值