我有一个网站列表,例如site1,site2,site3等(一个相当长的那个)映射到我的程序从它的远程客户端接收的一对单位数整数,我需要一种有效的方法来返回(作为字符串)网站基于这对整数的名称。第一个数字本身很重要,第二个数字不重要,除非与第一个数字配对。这些“站点代码”应该都返回一个唯一的字符串。
以下是我目前的做法:
#include<string>
#include<iostream>
#include<vector>
// sbits is a vector of integers from which these two integers are being pulled
std::string readSite( vector<int> sbits ) {
int rgcode = sbits[5];
int uid = sbits[6];
if ( rgcode == 0 ) {
if ( uid == 0 ) {
return "site1";
}
else if ( uid == 1 ) {
return "site2";
}
else if ( uid == 2 ) {
return "site3";
}
// throw an exception if it's not here
else {
std::throw 10;
}
}
else if ( rgcode == 1 ) {
if ( uid == 0 ) {
return "site4";
else if ( uid == 1 ) {
return "site5";
else {
std::throw 10;
}
}
else {
std::throw 5;
}
std::catch( int err ) {
std::cout << "An exception has occurred. Error "<< err << " closing." << std::endl;
exit;
}
}
关于这一切的一切都让我死了一点。写作很烦人,阅读很乏味,而且可能不适合我需要做的事情。
所以我的问题是:是否有更优雅(并且不那么自杀)的方式来做到这一点? 我一直在阅读关于std :: enum,std :: map的内容,但它们似乎不符合我在这里要做的事情。
编辑:有没有办法使用网站的某种有序列表来做到这一点?所以我不必经历并写出同一行的70多种变体。迭代每个的一些方法?可能?
答案 0 :(得分:2)
您需要正确定义数据结构以简化代码:
typedef std::pair<int, int> RgCodeUidPair;
// rgcode, uid
然后,您可以使用(rgcode, uid)
作为对搜索cachedData地图。
std::string readSite( int rgcode, int uid)
{
static std::map<RgCodeUidPair, std::string> cachedData; // cache data, only load once
if (cachedData.empty())
{
cachedData.insert(make_pair(make_pair(0, 0), "site1"));
cachedData.insert(make_pair(make_pair(0, 1), "site2"));
cachedData.insert(make_pair(make_pair(1, 0), "site3"));
cachedData.insert(make_pair(make_pair(1, 1), "site4"));
}
auto it = cachedData.find(make_pair(rgcode, uid));
if (it != cachedData.end())
{
return it->second;
}
// throw if not found
}
答案 1 :(得分:1)
另一种看待事物的方式:
#include <array>
#include <vector>
std::string const& readSite(std::vector<int> const& sbits ) {
static std::array<std::array<std::string, 10>, 10> const strs{{
{{ "site1", "site2", "site3" }},
{{ "site4", "site5" }}
}};
return strs.at(sbits.at(5)).at(sbits.at(6));
}
几点
exception
课程,而不是int
。答案 2 :(得分:1)
一种相当简单的方法是将int对减少为唯一字符串,然后用于存储站点。
#include <iostream>
#include <string>
#include <map>
#include <sstream>
using namespace std;
typedef map <string, string> SiteMap;
typedef pair<int, int> IntPair;
SiteMap map;
string ConvertPairToStr (IntPair const& pair)
{
int first = pair.first;
int second = pair.second;
stringstream unq;
unq << first;
unq << "_";
unq << second;
return unq.str();
}
void StoreSite (string site, IntPair p)
{
string unq = ConvertPairToStr(p);
map [p] = site;
}
string GetSite (IntPair p)
{
string unq = ConvertPairToStr(p);
// Assuming site is already stored
return map[p];
}