关于从int转换为字符串的帖子很多,但它们都涉及到只是打印到屏幕或使用ostringstream。
我使用的是ostringstream,但是我的公司不希望我使用任何流,因为它有可怕的运行时。
我在C ++文件中这样做。
我的问题是,我将在执行过程中创建数百万个流,写入缓冲区,然后将内容复制到字符串中,如下所示:
ostringstream OS;
os << "TROLOLOLOLOL";
std::string myStr = os.str();
存在冗余,因为它正在制作此缓冲区然后将其全部复制。 UGH!
答案 0 :(得分:6)
在C ++ 11中:
string s = std::to_string(42);
几个星期前我做了一个基准测试,得到了这些结果(使用当前Xcode附带的clang和libc ++):
stringstream took 446ms
to_string took 203ms
c style took 170ms
使用以下代码:
#include <iostream>
#include <chrono>
#include <sstream>
#include <stdlib.h>
using namespace std;
struct Measure {
chrono::time_point<chrono::system_clock> _start;
string _name;
Measure(const string& name) : _name(name) {
_start = chrono::system_clock::now();
}
~Measure() {
cout << _name << " took " << chrono::duration_cast<chrono::milliseconds>(chrono::system_clock::now() - _start).count() << "ms" << endl;
}
};
int main(int argc, const char * argv[]) {
int n = 1000000;
{
Measure m("stringstream");
for (int i = 0; i < n; ++i) {
stringstream ss;
ss << i;
string s = ss.str();
}
}
{
Measure m("to_string");
for (int i = 0; i < n; ++i) {
string s = to_string(i);
}
}
{
Measure m("c style");
for (int i = 0; i < n; ++i) {
char buff[50];
snprintf(buff, 49, "%d", i);
string s(buff);
}
}
return 0;
}
答案 1 :(得分:3)
在C ++ 11中,你有std::to_string
。虽然它可能在引擎盖下使用stringstream
技术。
答案 2 :(得分:0)
您应该查看boost::lexical_cast
的效果图表:
http://www.boost.org/doc/libs/1_52_0/doc/html/boost_lexical_cast/performance.html
它将lexical_cast与stringstream(有和没有构造)和scanf / printf进行比较。
在大多数情况下,boost :: lexical_cast比scanf,printf,std :: stringstream快。
答案 3 :(得分:0)
重用stringstream缓冲区。注意,这不是线程安全的。
#include <sstream>
#include <iostream>
#include <string>
template<class T>
bool str_to_type(const char *str, T &value) {
static std::stringstream strm;
if ( str ) {
strm << std::ends;
strm.clear();
strm.setf(std::ios::boolalpha);
strm.seekp(0);
strm.seekg(0);
strm << str << std::ends;
strm >> value;
return !strm.fail();
}
return false;
}
int main(int argc, char *argv[])
{
int i;
if (!str_to_type("42", i))
std::cout << "Error" << std::endl;
std::cout << i << std::endl;
return 0;
}