我有 20位,我想将它们与字符串相关联。除了使用switch case语句实现这一点之外,还有更快的方法吗?
我需要将int转换为相应的字符串,并且数字不一定是打包的。 Qt
中的某些代码也可能有用吗?
示例:以下数字和字符串相互关联,
1: "Request System Info"
2: "Change System Info"
10: "Unkown Error"
答案 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)
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)
再次阅读你的问题,我想你说你只有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!";
}
}