此函数从字符串中读取双精度数组:
vector<double> parseVals(string& str) {
stringstream ss(str);
vector<double> vals;
double val;
while (ss >> val) vals.push_back(val);
return vals;
}
Run Code Online (Sandbox Code Playgroud)
当使用包含100万个数字的字符串调用时,该函数需要7.8秒才能执行(Core i5,3.3GHz).这意味着花费25000个CPU周期来解析一个NUMBER.
user315052已经指出相同的代码在他的系统上运行速度快了一个数量级,并且进一步的测试显示了不同系统和编译器之间的非常大的性能差异(另见user315052的答案):
1. Win7, Visual Studio 2012RC or Intel C++ 2013 beta: 7.8 sec
2. Win7, mingw / g++ 4.5.2 : 4 sec
3. Win7, Visual Studio 2010 : 0.94 sec
4. Ubuntu 12.04, g++ 4.7 : 0.65 sec
Run Code Online (Sandbox Code Playgroud)
我在Boost/Spirit库中找到了一个很好的选择.代码安全,简洁,速度极快(VC2012上为0.06秒,比stringstream快130倍).
#include <boost/spirit/include/qi.hpp>
namespace qi = boost::spirit::qi;
namespace ascii = boost::spirit::ascii;
vector<double> parseVals4(string& str) {
vector<double> vals;
qi::phrase_parse(str.begin(), str.end(),
*qi::double_ >> …Run Code Online (Sandbox Code Playgroud) 我想将boost.serialization与模板化容器类一起使用:
// MyContainer.h
template<class T> struct MyContainer {
T t;
template<class Archive>
void serialize(Archive& archive, const unsigned version) {
archive & t;
}
};
Run Code Online (Sandbox Code Playgroud)
当我使用STL容器作为模板参数时,例如
// Main.cpp
...
MyContainer<array<int,4>> mc;
std::ofstream ofs("foo.bar");
boost::archive::binary_oarchive oa(ofs);
oa << mc;
...
Run Code Online (Sandbox Code Playgroud)
... Visual Studio 11抱怨以下错误消息:
'serialize' : is not a member of 'std::array<_Ty,_Size>'
Run Code Online (Sandbox Code Playgroud)
我试图在两个文件中包含"boost/serialization/array.hpp",但这并没有解决问题.此外,包括数组专门化不是我想要的,因为容器也可以容纳任何其他STL容器.
这样做的正确方法是什么?