我正在做一些非常简单的事情:将整个文本文件从磁盘中抹去std::string.我目前的代码基本上是这样的:
std::ifstream f(filename);
return std::string(std::istreambuf_iterator<char>(f), std::istreambuf_iterator<char>());
Run Code Online (Sandbox Code Playgroud)
它不太可能对程序产生任何性能影响,但我仍然很好奇这是否是一种缓慢的方式.
是否存在构造字符串将涉及大量重新分配的风险?在读取之前使用seekg()/ tellg()计算文件大小和reserve()字符串中的那么多空间会更好(也就是说更快)吗?
我试图以std::string依赖于语言环境的方式比较s.
对于普通的C风格的字符串,我发现strcoll,这完全符合我的要求std::setlocale
#include <iostream>
#include <locale>
#include <cstring>
bool cmp(const char* a, const char* b)
{
return strcoll(a, b) < 0;
}
int main()
{
const char* s1 = "z", *s2 = "å", *s3 = "ä", *s4 = "ö";
std::cout << (cmp(s1,s2) && cmp(s2,s3) && cmp(s3,s4)) << "\n"; //Outputs 0
std::setlocale(LC_ALL, "sv_SE.UTF-8");
std::cout << (cmp(s1,s2) && cmp(s2,s3) && cmp(s3,s4)) << "\n"; //Outputs 1, like it should
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是,我也希望有这种行为std::string.我可以过载operator<来做类似的事情
bool …Run Code Online (Sandbox Code Playgroud) 是否有一个Python类file围绕字符串包装接口(读,写等)?我的意思是像stringstreamC++中的类.
我正在考虑使用它将输出重定向print到一个字符串,就像这样
sys.stdout = string_wrapper()
print "foo", "bar", "baz"
s = sys.stdout.to_string() #now s == "foo bar baz"
Run Code Online (Sandbox Code Playgroud)
编辑:这是一个副本如何在Python中的文件中包装一个字符串?
对于普通的C++函数,可以在参数列表中显示模板参数:
template<typename T>
T default_construct()
{
return T();
}
Run Code Online (Sandbox Code Playgroud)
并称之为
some_type x = default_construct<some_type>();
Run Code Online (Sandbox Code Playgroud)
即使我使用的类型不在参数列表中,我仍然可以将它传递给函数.现在,我想在类构造函数中执行此操作:
struct Base;
template<typename T>
Base* allocate()
{
return new T; //Assume T derives from Base...
}
struct factory {
template<typename T>
factory()
: func(allocate<T>)
{}
std::tr1::function<Base*()> func;
};
Run Code Online (Sandbox Code Playgroud)
但是当我想构造一个实例时,我找不到一种方法来为构造函数提供参数factory.
有没有办法在不将类转换为模板化类或将一些未使用的T对象发送到构造函数的情况下执行此操作?