可以使用string::clear函数来清空字符串,也可以使用空双引号""来做到这一点。有什么区别? 最佳答案 当您分配一个空字符串时,编译器必须在数据部分存储一个空的C字符串,并创建代码以将指向它的指针传递给赋值运算符。然后赋值运算符必须从数据部分读取,只是为了找出您传递了一个空字符串。使用clear(),编译器只生成一个不带任何参数的函数调用。数据部分没有空字符串,没有传递指针,没有读取等。你甚至可能有一个编译器,可以优化它。我不知道是否有,但标准库不能依赖特定的编译器功能,这不是必需的。一个更重要的区别是表达意图。如果您希望代
本题中的代码使用了Either在这里找到实现:https://github.com/LoopPerfect/neither.明确地说,我怀疑这是这个特定库的问题,否则我会在那里制造问题。以下代码段按预期工作:std::futuref=std::async(std::launch::async,[](){return"test";}std::cout下面会产生一个段错误:std::future>f=std::async(std::launch::async,[](){returnneither::Either(neither::right(std::string("test")));})
有时您需要用C函数构造的字符填充std::string。一个典型的例子是这样的:constexprstaticBUFFERSIZE{256};charbuffer[BUFFERSIZE];snprint(buffer,BUFFERSIZE,formatstring,value1,value2);returnstd::string(buffer);注意我们首先需要填充本地缓冲区,然后将其复制到std::string。如果计算了最大缓冲区大小并且不一定要存储在堆栈中的内容,则该示例会变得更加复杂。例如:constexprstaticBUFFERSIZE{256};if(calculated
我有一个WCHAR[]:WCHARfoo[200];我想将值复制到其中:if(condition){foo=L"bar";}else{foo=L"odp";}执行此操作的最佳方法是什么? 最佳答案 wcscpy,尽管最好的办法是使用std::wstring相反。std::wstringfoo;if(condition)foo=L"bar";elsefoo=L"odp";或者如果你坚持使用wcscpy:WCHARfoo[200];if(condition)wcscpy(foo,L"bar");elsewcscpy(foo,L"odp"
字符串的容量大小总是15的倍数吗?例如:在所有情况下容量都是15strings1="Hello";strings2="Hi";strings3="Hey";还是随机的? 最佳答案 Isthecapacitysizeofstringalwaysamultiplevalueof15?没有;关于std::string容量的唯一保证是s.capacity()>=s.size()。一个好的实现可能会以指数方式增加容量,以便每次需要重新分配底层数组时它的大小都会加倍。这对于std::vector是必需的,因此push_back可以具有摊销常数时
我一直认为std::string是作为C字符数组字符串的STL包装器实现的。但是仔细观察这个设计,我注意到它没有给出任何暗示或迹象表明它是一个包裹起来的C弦。据我所知,std::string可以在内部做任何事情!当然有c_str()方法,我认为它返回了内部字符数组,但我怎么知道该方法是否没有创建一个新cchar数组从它存储在里面的任何数据并返回它?说真的,std::string是如何实现的?它(看起来)只是Cchar数组的包装器,还是其他东西?还是两者的混合?或者甚至可以有条件地成为两者? 最佳答案 ForallIknowanstd
我正在阅读一本C++教程书,作者说大多数C++编译器都包含一个String类库,但即使有,也建议创建您自己的String类。不幸的是,作者没有说明原因。有没有人不同意/同意,为什么?我正在使用Xcode,所提供的String类对我来说似乎很好,但话又说回来,我只使用它几个小时,所以我不知道它的局限性。提前致谢。 最佳答案 我觉得你有一本旧书。C++标准库包括std::string类,您应该使用它而不是自己发明并修复已经在广泛使用的库中遇到和修复的错误。作为初学者,是的,您应该尝试实现自己的方法,因为它会教给您很多东西。只是不要在任何
为什么C++标准允许以下内容?#include#includeintmain(){std::strings(10,'\0');//s.length()nowis10std::cout为什么要加0算呢?它看起来像是破坏了字符串的完整性,不是吗?但我检查了标准,这是正确的行为。 最佳答案 Whydoesstandardallowsfollowing?因为设计C++字符串的人决定允许这样的事情发生。我不确定设计C++字符串的团队中是否有人在SO上……但是既然你自己说标准允许它,那就是它的方式,我怀疑它是否会改变。有时拥有一个可以包含“任何
虽然查找std::stringvector中的字符数量很简单,但我想知道是否有办法使用STL为您完成所有工作,而不是使用两个for循环,一个循环遍历vector,另一个循环遍历vector每个索引中的字符串。我尝试过使用其他STL函数(例如尝试以几种独特的方式使用std::for_each),但我所有的尝试都没有成功。intmain(void){intchars=0;std::vectorstr;str.push_back("Vector");str.push_back("of");str.push_back("four");str.push_back("words");for(int
我发现了这个在C++中使用placementnew的例子,它对我来说没有意义。我认为这段代码容易出现异常,因为可能会使用比分配的内存更多的内存。char*buf=newchar[sizeof(string)];string*p=new(buf)string("hi");如果“string”是C++STD::string类,那么buf将得到一个分配空字符串对象的大小(我的编译器给出了28个字节),然后我看到它的方式如果你用更多的字符初始化你的字符串你可能超过分配的内存。例如:string*p=new(buf)string("hiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii