c ++基于整数对返回字符串

时间:2014-07-10 02:21:30

标签: c++

我有一个网站列表,例如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多种变体。迭代每个的一些方法?可能?

3 个答案:

答案 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];
}