我有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
如果您有一个实现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