C ++:有效地向字符串添加整数

时间:2010-04-27 19:22:10

标签: c++ string performance

我知道如何将整数添加到字符串中,但我不确定我是否在有效的事情中这样做。我有一个类,我经常要返回一个字符串加一个整数(每次都是一个不同的整数),在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也是这样做的,我只是没注意到它,我说它效率低,主要是因为我对字符串知之甚少。

有更有效的方法吗?

4 个答案:

答案 0 :(得分:6)

std::ostringstream是在C ++中执行此操作的“标准”方法。您可以通过一些自定义编码提高效率,或者在您将部署此程序的所有系统上费力地比较ostringstreamitoasprintf的效果,但这可能不值得努力。

我会说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)

要添加其他答案:

  

...代码有效,但在C ++中我必须创建一堆ostringstream对象,因此似乎效率低下。公平地说,也许Java也是如此,我只是没注意到它,......

事实上,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;
}