C++ 有没有更干净的方法来写这个?(数字到字符串)

C++ 有没有更干净的方法来写这个?(数字到字符串),c++,C++,我做了一个数字到数字的转换器,但它的编写方式似乎太冗长了。 我好像有人在谈论使用开关。我应该用开关重写它,还是有更好的方法来编写它 string numberToString(int n) { if (n == 0) return "zero"; if (n == 1) return "one"; if (n == 2) return "two"; if (n == 3) return "three"; if (n == 4) retu

我做了一个数字到数字的转换器,但它的编写方式似乎太冗长了。 我好像有人在谈论使用开关。我应该用开关重写它,还是有更好的方法来编写它

string numberToString(int n)
{
  if (n == 0)
    return "zero";
  if (n == 1)
    return "one";
  if (n == 2)
    return "two";
  if (n == 3)
    return "three";
  if (n == 4)
    return "four";
  if (n == 5)
    return "five";
  if (n == 6)
    return "six";
  if (n == 7)
    return "seven";
  if (n == 8)
    return "eight";
  if (n == 9)
    return "nine";
  else
    return "?";
}

尝试使用数组文字

string numberToString(int n) {
  return (n >= 0 && n <= 9) ?
    (string[]){
      "zero",
      "one",
      "two",
      "three",
      "four",
      "five",
      "six",
      "seven",
      "eight",
      "nine",
    }[n]
  :
    "?";
}
字符串编号字符串(int n){

return(n>=0&&n这将很容易工作,并且可读性和可重用性很强

#include <string>
#include <vector>
#include <iostream>

class Converter {
private:
    const std::vector<std::string> numbers{ "zero", "one", "two", "three", "four",
                                            "five", "six", "seven", "eight", "nine", "?" };
public:
    std::string operator()( int n ) { 
        if ((n < 0) || (n > 10))
             return numbers.at(10);   
       return numbers.at(n); 
    }
};


int main() {
     Converter c;
     for ( int i = -5; i < 15; i++ )
         std::cout << c(5) << '\n';

     return 0;
}

我根本不用开关

std::string numberToString(int n) 
{
    const char *literal[] = {"zero", "one", "two", "three", "four", "five",
                           "six", "seven", "eight", "nine"};
    const char *no_result = "?";

    return std::string ( (n < 0 || n >= 10) ? no_result : literal[n]); 
}
std::字符串编号字符串(int n)
{
常量字符*文字[]={“零”、“一”、“二”、“三”、“四”、“五”,
“六”、“七”、“八”、“九”};
常量字符*无结果=“?”;
返回std::string((n<0 | | n>=10)?无结果:文本[n]);
}
return语句中的转换是可选的(隐式进行),但我更喜欢显式转换

如果需要,
literal
no_result
的类型可以设置为
std::string

短版本:

std::string numberToString(int n)
{
    return (const char *[]){"zero", "one", "two", "three", "four", "five",
            "six", "seven", "eight", "nine", "?"}[unsigned(n) < 11 ? n : 10];
}
std::字符串编号字符串(int n)
{
返回(常量字符*[]){“零”、“一”、“二”、“三”、“四”、“五”,
“六”、“七”、“八”、“九”、“十”}[无符号(n)<11?n:10];
}

开关同样冗长。您可以使用数组。使用A。如果
n
在0-9之外,这会引发异常,这与OP要求的不同。建议修复。@Peter我只是给出了基本结构;当然,由于vector的at函数,这会引发异常。@Peter这本不应该那么难OP需要解决一个问题,但我已经用一个可能的解决方案更新了代码。@Peter我在返回中有一个拼写错误,它已经解决了now@Francis:是的,完全正确。可以省略类。和私有访问控制。在堆栈上创建一个实例只是为了进行转换。和几个内存字节。和几个CPU周期。这看起来很慢。两个teral和no_结果在每次调用函数时都在堆栈上分配和初始化。@JohannesOvermann-这不是真的。字符串文字具有静态存储持续时间,即使是基本编译器也可能避免每次创建变量。这是编译器的基本转换。如果确实存在问题,请变量
static
。担心和调整这样的代码以获得性能,这被称为“过早优化”,原因是——除非有证据(来自分析)对于性能问题,有更好的事情需要花费精力。@P:您正在给一个新的参与者提供答案,他很容易陷入在堆栈上创建复杂对象的陷阱。是的,这些变量应该是静态的。显式的比隐式的好。是的,性能是一个主要的问题,否则就不会有什么问题Eason使用C++,一种语言,其中每一个特征都是为了获得最大的运行时性能,甚至以方便、稳定和安全为代价。@ JohannesOvermann -该评论有点丰富,因为您的答案使用完全相同的逻辑,但在一个语句中。>(这是一个比
char*
数组更复杂的结构)如果你担心性能,改变你的答案,所以它没有你指责我引入的相同的缺陷。由于某种原因,我无法用VS2017CE编译我的C++最新草案标准……用G++ 5.4×编译。ツ)_/“'虽然这看起来很优雅,但实际上它在每次调用时都会构造10个冗余字符串。@RichardHodges说得很好。我只是快速地将它升级,以展示如何使用数组和索引来避免if/else链或开关。
std::string numberToString(int n)
{
    return (const char *[]){"zero", "one", "two", "three", "four", "five",
            "six", "seven", "eight", "nine", "?"}[unsigned(n) < 11 ? n : 10];
}