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