我知道如何将整数添加到字符串中,但我不确定我是否在有效的事情中这样做。我有一个类,我经常要返回一个字符串加一个整数(每次都是一个不同的整数),在Java中我会做类似的事情
public class MyClass {
final static String S = "MYSTRING";
private int id = 0;
public String getString() {
return S + (id++);
}
}
但是在C ++中我必须这样做;
class MyClass {
private:
std::string S; // For some reason I can't do const std::string S = "MYSTRING";
int id;
public:
MyClass() {
S = "MYSTRING";
id = 0;
}
std::string getString() {
std::ostringstream oss;
oss << S << id++;
return oss.str();
}
}
另一个约束:我不想(事实上,不能)使用Boost或任何其他库,我将不得不使用标准库。
所以事情是这样的;代码有效,但在C ++中我必须创建一堆ostringstream对象,因此似乎效率低下。公平地说,也许Java也是这样做的,我只是没注意到它,我说它效率低,主要是因为我对字符串知之甚少。
有更有效的方法吗?
答案 0 :(得分:6)
std::ostringstream
是在C ++中执行此操作的“标准”方法。您可以通过一些自定义编码提高效率,或者在您将部署此程序的所有系统上费力地比较ostringstream
,itoa
和sprintf
的效果,但这可能不值得努力。
我会说std::ostringstream
解决方案的真正问题与效率无关。真正的问题是代码看起来太复杂了。
我知道您不想使用Boost,但如果您查看Herb Sutter的The String Formatters of Manor Farm,您可以将lexical_cast<>()
模板的(非常小的)定义复制到您的程序中。然后你的代码看起来像这样:
std::string getString() {
return S + lexical_cast<std::string>(id++);
}
这是否比现有解决方案更有效取决于很多因素(例如,编译器内联模板实例的程度),但它看起来更清晰。
答案 1 :(得分:3)
我很确定你可以做到以下几点:
class MyClass
{
private:
const std::string S; // For some reason I can't do const std::string S = "MYSTRING";
int id;
public:
MyClass() :
S( "MYSTRING" )
{
id = 0;
}
}
这完全脱离了我的头脑,虽然没有经过考验但我完全可以期待大量的选票:D hehehe
答案 2 :(得分:2)
要添加其他答案:
事实上,Java确实做了同样的事情; +使用字符串是...代码有效,但在C ++中我必须创建一堆ostringstream对象,因此似乎效率低下。公平地说,也许Java也是如此,我只是没注意到它,......
StringBuffer.append()
的语法糖,所以这些做同样的事情:
String f = "foo";
f += "bar" + "baz";
String f = "foo";
f = StringBuffer(f).append("bar").append("baz");
答案 3 :(得分:0)
你是对的,ostringstream通常会增加开销。
这更有效率,IMO更具惯用性......
std::string adder() {
static int i;
char buf[32];
snprintf(buf, sizeof(buf), "MYSTRING%i", i++);
return buf;
}