如何在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差异很大,那就不合适了。