如何将int映射到C / C ++中的相应字符串

时间:2009-12-15 22:05:19

标签: c++ c qt

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

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

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

1:   "Request System Info"

2:   "Change System Info"

10:  "Unkown Error"

11 个答案:

答案 0 :(得分:17)

我推荐std :: map<>

#include <map>
#include <string>

std::map<int, std::string> 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<int, std::string>::const_iterator iter =
    mapping.find(num);
if (iter != mapping.end())
{
    // iter->second contains your string
    // iter->first contains the number you just looked up
}

如果你有一个实现initalizer-list feature of the draft C++0x standard的编译器,你可以结合地图的定义和初始化:

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

的std ::地图&LT;&GT; std :: map&lt;&gt; :: find在O(log N)中运行,可以很好地扩展到大量条目。获得hash-map feature of the draft C++0x standard后,您可以轻松将其转换为std :: unordered_map&lt;&gt;它应该能够在O(1)时间内查找。

答案 1 :(得分:7)

Qt还提供了自己的地图实施 - QMapQHash

QMap<int, QString> myMap;
myMap[1234] = "Some value";
myMap[5678] = "Another value";

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

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

答案 2 :(得分:4)

使用地图的简便方法

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

答案 3 :(得分:3)

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

答案 4 :(得分:3)

如果您的字符串在编译时已知,那么您可以在C:

中执行此操作
#include <stdio.h>

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;
}

答案 5 :(得分:2)

如果您的数字和字符串不变,则地图将无效;它必须加载。

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

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

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

答案 6 :(得分:1)

像:?

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

答案 7 :(得分:0)

std::map


再次阅读你的问题,我想你说你只有20个数字要映射(你说20位数,这让我想到了非常大的数字)。如果这些都在相当小的范围内,那么使用数组可能会更好。您需要一个与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差别很大,那就不合适了。

答案 8 :(得分:0)

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

std :: map messages;

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

如果要从文件中读取它们,那么

std::ifstream ifile("the file")

while (ifile && !ifile.eof())
{
  ifile >> key >> value;
  messages[key] = value;
}

答案 9 :(得分:0)

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

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

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

答案 10 :(得分:0)

我一直喜欢将开关作为控制结构。易于理解和维护。请注意,早期的return缩短了对break的需求。

此示例已经过测试并可以正常工作:

char* getError(int err){
  switch(err){
    case 1: return "Request System Info";
    case 2: return "Change System Info";
    case 10: return "Unkown Error";
    default: return "Whaaaat!";
  }   
}