c/c++语言开发共享如何在C / C ++中将int映射到相应的字符串

我有20位数字 ,我想将它们与字符串相关联。 除了使用switch case语句实现这一点之外,还有更快的方法吗?

我需要将int转换为相应的字符串,并且数字不一定是打包的。 Qt一些代码也可能有用吗?

示例:以下数字和字符串相互关联,

 1: "Request System Info" 2: "Change System Info" 10: "Unkown Error" 

    更简单的方法来使用地图

     std::map mymap; mymap[1] = "foo"; mymap[10] = "bar"; // ... int idx = 10; std::string lookup = mymap[idx]; 

    我推荐std :: map <>

     #include  #include  std::map mapping; // Initialize the map mapping.insert(std::make_pair(1, "Request System Info")); mapping.insert(std::make_pair(2, "Change System Info")); mapping.insert(std::make_pair(10, "Unkown Error")); // Use the map std::map::const_iterator iter = mapping.find(num); if (iter != mapping.end()) { // iter->second contains your string // iter->first contains the number you just looked up } 

    如果您有一个实现C ++ 0x标准草案的initalizer-listfunction的编译器,那么您可以组合地图的定义和初始化:

     std::map mapping = {{1, "Request System Info"}, {2, "Change System Info"} {10, "Unkown Error"}}; 

    std :: map <>可以很好地扩展到大量条目,因为std :: map <> :: find在O(log N)中运行。 一旦你拥有草案C ++ 0x标准的哈希映射function ,你就可以轻松地将它转换为std :: unordered_map <>,它应该能够在O(1)时间内查找。

    Qt还提供了自己的地图实现–QMap和QHash 。

     QMap myMap; myMap[1234] = "Some value"; myMap[5678] = "Another value"; 

    要么

     myMap.insert(1234, "Some value"); 

    文档提供了更多示例,但它非常易于使用。

    如果您正在寻找速度,那么switch语句将是最有效的。 大多数C / C ++编译器都会将它实现为二叉树,所以它非常快。

    如果您的字符串在编译时已知,那么您可以在C中执行此操作:

     #include  struct message { int val; const char *msg; }; int main(void) { struct message messages[] = { {1, "Request System Info"}, {2, "Change System Info"}, {10, "Unkown Error"} }; size_t nmessages = sizeof messages / sizeof messages[0]; size_t i; for (i=0; i < nmessages; ++i) { printf("%d : '%s'n", messages[i].val, messages[i].msg); } return 0; } 

    如果您的数字和字符串是常量,则地图将不起作用; 它必须加载。

    对于常数和字符串,我建议使用以下数组:

     struct Entry { unsigned int key; const char * text; }; 

    对于大量使用二进制搜索算法; 否则线性搜索的速度一样快(只要数组被排序)。

    就像是: ?

     #include  using namespace std; string f(int i) { ostringstream oss; oss << i; return oss.str(); } 

    编译时是否知道字符串? 如果是这样,创建一个地图

    std :: map messages;

    messages [key] =“some value”; 消息[key2] =“其他一些值”;

    等等

    如果他们要从文件中读取,那么就是这样的

     std::ifstream ifile("the file") while (ifile && !ifile.eof()) { ifile >> key >> value; messages[key] = value; } 

    等等

    如果你的数字是连续的(或几乎是这样),一个简单的数组或字符串向量将很好地工作。

    如果数字之间存在较大差距,则最快的方法可能是std::pair (或std::pair )的数组。 虽然大多数人自动想到快速查找的二进制搜索,但在这种情况下,要考虑的少数可能性可能允许线性搜索非常有效地竞争 – 实际上,它可能是可用的最快选择。 原因很简单:虽然它会进行更多的比较,但它可以避免分裂之类的事情,并且无论如何,20个整数的比较都会很快。

    编辑:注意std :: map可能不是一个很好的选择。 std :: map通常使用平衡二叉树,这意味着20个项目将使用20个节点,每个节点通常单独分配。 除了你需要存储的int之外,每个节点通常至少包含两个指针,因此你所存储的数据量大约是三倍 – 所有这些都会增加相对较差的缓存局部性。 鉴于所涉及的项目数量较少,一次缓存未命中将花费超过20次比较。

    std::map


    再次阅读你的问题,我想你说你只有20个数字要映射(你说20个数字,这让我想到了非常大的数字)。 如果这些都在相当小的范围内,那么使用数组可能会更好。 你需要一个与largestIndex - smallestIndex + 1一样大的字符串指针数组largestIndex - smallestIndex + 1 。 然后要获得与某个数字相关联的字符串,您可以执行以下操作:

     std::string GetStatus(int statusID){ return statusArray[statusID - smallestIndex]; } 

    statusArray变量初始化为类似于:

     void SetStatus(int statusID, std::string description){ statusArray[statusID - smallestIndex] = description; } void InitStatuses(){ statusArray = new std::string[largestIndex - smallestIndex + 1]; SetStatus(1, "Request System Info"); SetStatus(2, "Change System Info"); SetStatus(10, "Unknown Error"); } 

    这比map快,而且非常容易使用。 如果您的ID差异很大,那就不合适了。

      以上就是c/c++开发分享如何在C / C ++中将int映射到相应的字符串相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/544723.html

      (0)
      上一篇 2021年1月9日
      下一篇 2021年1月9日

      精彩推荐