最近我注意到以下陈述并非如此std::string s.
s.max_size() == s.get_allocator().max_size();
Run Code Online (Sandbox Code Playgroud)
我发现这很有意思,默认情况下std::string会使用std::allocator<char>它具有理论极限size_type(-1)(是的,我知道我假设2的补码,但这与实际问题无关).我知道实际的限制将远远小于此.在典型的32位x86系统上,内核将占用2GB(可能是1GB)的地址空间,从而留下更小的实际上限.
无论如何,GNU libstdc ++ std::basic_string<>::max_size()似乎返回相同的值,无论它使用什么分配器(如类似1073741820).
所以问题仍然存在,为什么不std::basic_string<>::max_size()回归get_allocator().max_size()呢?在我看来,这是假设的上限.如果分配很短,它只会扔一个std::bad_alloc,所以为什么不尝试?
这更像是一种好奇心,我只是想知道为什么这两者至少在这一个实现中被单独定义.
我想要一个函数,它将采用time_t参数和任意格式字符串并对其进行格式化.我想要这样的东西:
std::string GetTimeAsString(std::string formatString, time_t theTime)
{
struct tm *timeinfo;
timeinfo = localtime( &theTime);
char buffer[100];
strftime(buffer, 100, formatString.c_str(), timeinfo);
std::string result(buffer);
return result;
}
Run Code Online (Sandbox Code Playgroud)
但是我遇到的一个问题是缓冲区长度.我想做一些像formatString*4这样的缓冲区长度.但我猜你不能动态设置缓冲区长度?也许我可以挑选一个任意大的缓冲区?我有点担心如何使它成为通用的.
如何编写一个函数来实现这一目标?
我找了一下上一个转换的最佳方法的建议std::wstring,以std::string-但一个快速和肮脏的转换用作一个关键std::map<std::string, int>对象.
地图非常大,并且已经很好地集成到项目中,并且只有少数键需要这种转换,因此我认为将地图更改为接受std::wstring键的地图将是浪费.
转换的输出并不重要,但必须保持一致,以便每次都可靠地从地图中提取正确的值.
该应用程序是仅限Windows的应用程序.
是否有任何已知的过程可靠地为此目的进行粗略转换?或者最好的方法是通过通常的,正确的转换过程(如本问题/答案中所述:如何将wstring转换为字符串?)?
编辑:请记住 - 只要事情一致,丢失的信息就可以了.即如果我投入一些日文字符,并且它们一直转换成相同的(可能是垃圾)std::string,那很好.这永远不会用于显示,只能用作从地图中提取值的键.
谢谢!
我对大多数C++都非常熟悉,但我避免的一个领域是IO流,主要是因为我一直在嵌入式系统中使用它们,因为它们不合适.然而,最近我不得不熟悉它们,而我正在努力找出一些我认为应该简单的东西.
我正在寻找一种相对有效的方法从C++流中读取固定数量的字符到std::string.我可以轻松地char使用该read()方法读入临时数组并将其转换为a std::string,但这相当丑陋且涉及浪费的副本.我还可以将整个流读入一个字符串,如下所示:
std::string getFile(std::fstream &inFile)
{
std::stringstream buffer;
buffer << inFile.rdbuf();
return buffer.str();
}
Run Code Online (Sandbox Code Playgroud)
...但无限读入内存通常是一个糟糕的想法,所以我真的想一次访问一个块,比如4K左右.我也可以一次读取字符,但这比阅读临时char数组感觉更丑陋,效率更低.
那么,是否有一种简单的方法可以std::string直接从包含流中下一个N个字符的流中获取?很可能根本就没有办法做到这一点,但我觉得这样的事情会丢失,所以我觉得我必须错过一些明显的东西.
顺便说一下,我对C文件IO API非常熟悉,我不是在寻找涉及它们的解决方案.我可以敲东西了read()和write(),但我的工作的代码使用了大量的数据流,并且我认为这是很好的做法,以保持我的代码添加的一贯作风.
我是valgrind的新手,所以这可能会错过解释输出.Valgrind似乎认为字节在以下几行中丢失:
if ( mysqlpp::StoreQueryResult result = query.store() ){
for ( size_t i = 0; i < result.num_rows(); ++i ){
hash = std::string( result[i]["hash"].data(), result[i]["hash"].length() );
label = std::string( result[i]["label"].data(), result[i]["label"].length() );
keywords = std::string( result[i]["keywords"].data(), result[i]["keywords"].length() );
task_raw = std::string( result[i]["task"].data(), result[i]["task"].length() );
solution_raw = std::string( result[i]["solution"].data(), result[i]["solution"].length() );
Run Code Online (Sandbox Code Playgroud)
事实上,每当有一个std :: string以这种方式构建时,它就会抱怨^^.如果我正在复制的方式不正确,或者结果是以某种方式泄露,我无法弄清楚这是否是误报.
有趣的是,它抱怨另一段不使用mysql ++的代码,但同样使用了一个字符串构造函数:
for ( auto & f : frames ){
for ( unsigned int i = 0; i < f.getTask().size(); i++ ){
if ( i + 1 < …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个函数,该函数采用可变数量的std :: string参数并使用它格式化字符串。
例:
Test::formatLine(const string::format, ...)
{
const std::string buffer;
va_list args;
va_start(args, format);
vsprintf(buffer.c_str, format.c_str, args);
va_end(args);
cout << buffer << endl;
}
Run Code Online (Sandbox Code Playgroud)
编译此代码段错误:
Error 1 error C3867: 'std::basic_string<char,std::char_traits<char>,std::allocator<char>>::c_str': function call missing argument list; use '&std::basic_string<char,std::char_traits<char>,std::allocator<char>>::c_str' to create a pointer to member
Run Code Online (Sandbox Code Playgroud)
我要实现的目标:
Test t = Test();
t.formatLine("Hello %s!", "monsieur");
Run Code Online (Sandbox Code Playgroud)
应该打印 Hello monsieur!
t.formatLine("Hello %s %s! How %s you today?", "good", "sir", "are");
Run Code Online (Sandbox Code Playgroud)
应该打印 Hello good sir! How are you today?
它甚至有可能使用va_list,并vsprintf与std::string只,避免 …
有没有理由我经常看到这个结构:
std::string myString = someString + "text" + otherString + "more text";
Run Code Online (Sandbox Code Playgroud)
...而不是这个(我很少看到):
std::string myString;
myString += someString += "text" += otherString += "more text";
Run Code Online (Sandbox Code Playgroud)
阅读std::stringAPI,在我看来,operator+创建了很多临时工(可能是由编译器RVO优化?),而operator+=变体只附加文本.
在某些情况下,operator+变体将是要走的路.但是当你只需要将文本附加到现有的非const字符串时,为什么不使用operator+=呢?有什么理由不去?
-Rein
有一个简单的方法吗?我尝试过以下方法:
typedef allocator<char,managed_shared_memory::segment_manager>
CharAllocator;
typedef boost::container::basic_string<char, std::char_traits<char>, CharAllocator>
my_basic_string;
std::string s(my_basic_string);
Run Code Online (Sandbox Code Playgroud) 在面试中我被问到一个问题.
因此我有一个函数void f(std::string),我称之为函数f("int").所以我的函数必须int x在它的体内创建一个局部.有没有办法从中获取类型const char*.我知道boost::mpl::vector确实可以解决这类问题.谁能告诉我这项技术?
在C++ 14程序中,我给了一个类似的字符串
std::string s = "MyFile####.mp4";
Run Code Online (Sandbox Code Playgroud)
和0到几百的整数.(它永远不会是一千个或更多,但只有四个数字.)我想####用整数值替换" ",根据需要使用前导零来匹配'#'字符数.什么是灵活的C++ 11/14修改s或生成这样的新字符串的方法?
通常我会使用char*字符串snprintf(),strchr()并找到" #",但我应该得到现代和std::string更频繁使用,但只知道它的最简单的用途.