草庐IT

c++ - 当字符串保存在一个集合中时,c_str() 是否仍然有效

我有一个旧项目需要维护,其中使用了constchar*。出于某种原因,我想保留大量运行时生成的字符串。所以我创建了一个全局变量std::set来保存这些字符串。当生成新字符串时,除了添加到集合中外,我还会返回并发送newString.c_str(),它将保存在其他地方。例如。std::setg_stringDB;voidArchieveString(AStruct*container,constchar*temporaryString){autoit=g_stringDB.emplace(temporaryString);container->validString=it->first

c++ - C++中c_str()的线程安全

我创建了一个类SettingsClass,它包含静态字符串,这些静态字符串包含MySQLC++连接器库要使用的数据库连接字符串(例如主机名、数据库名、用户名、密码)。每当函数需要连接到数据库时,它都会对这些静态字符串调用.c_str()函数。例如:ClassSettingsClass{public:staticstringhostname;...}SettingsClass;stringSettingsClass::hostname;//AfunctionthatneedstoconnecttotheDBuses:driver=get_griver_instance();driver-

C++ 移动语义说明

我有一个包含std::string的Text类。方法SetText如下:voidText::SetText(conststd::string&str){m_str=str;}由于此方法几乎总是以右值作为参数调用,因此我想到了移动构造函数。我了解基本知识,但仅此而已。所以我进行了测试并得出结论,另一个类似的函数会更好,一旦定义了移动构造函数和移动赋值,就可以提高性能:voidText::SetText(std::string&&str){m_str=move(str);}有我的问题:它适用于std容器吗?他们是否提供移动构造函数和赋值?当类没有堆分配时,移动语义是否有用?(我的意思是根本

c++ - str.clear() 和 str = ""之间的区别

我有一个C++std::stringstr,我已将其设置为某个字符串,现在想重置它以便再次使用它。调用str.clear()与调用str=""有区别吗?编辑。澄清一下:我通过向其附加一个char数组缓冲区来重用str:str.append(buf) 最佳答案 没有有效的区别。根据实现的不同,使用clear()可能比将char指针分配给零更快。但是,即使情况并非如此,也更喜欢更清楚地表达您的意图的方法。如果要清除字符串,请使用clear()。如果要分配空字符串,请使用=""。虽然我会注意到,但你说,“所以我可以再次使用它。”又用它干什

c++ - 'for(auto &str : vec)' 内部 for 循环的目的是什么?

我是C++的新手,正在尝试学习vector的概念。我在网上看到这段代码。我的问题是,'for(auto&str:vec)'中的内部for循环的目的是什么?为什么作者要对第一个引用(&str)创建第二个引用(&c)?intmain(){vectorvec;for(stringword;cin>>word;vec.push_back(word)){}for(auto&str:vec){for(auto&c:str){c=toupper(c);}}for(inti=0;i!=vec.size();++i){if(i!=0&&i%8==0)cout 最佳答案

c++ - 从 priority_queue 弹出时出现排序问题,这是 std::priority_queue 的错误吗

#include#include#include#includestructTemp{intp;std::stringstr;};structTempCompare{booloperator()(Tempconst&a,Tempconst&b){returna.p>b.p;}};intmain(){std::priority_queue,TempCompare>pq;//EnableandDisablethefollowinglinetoseethedifferentoutput//{Tempt;t.p=8;t.str="str1";pq.push(t);}{Tempt;t.p=8;t

c++ - 调试断言在发布版本中究竟会做什么?

我的应用程序在处理中文字符(宽)时在发布版本中表现异常。我有下面一行在Debug模式下抛出调试断言:str.erase(std::remove_if(str.begin(),str.end(),isspace),str.end());(其中str是std::wstring)此行在Debug模式下抛出断言。我知道这是因为isspace无法处理宽字符。我必须使用iswspace而不是isspace。str.erase(std::remove_if(str.begin(),str.end(),isspace),str.end());if(!str.empty()){//addstrtoGUI

c++ - 按大写字母顺序排列字符串 C++

我试图用C++创建一个程序,以大写字母在其对应的小写字母之前的方式按字母顺序对给定字符串进行排序。例子:DCBA排序字符串:AaBbCcDd下面是代码。#include#include#includestructchar_{charc;chardiff;char_();char_(charx);};char_::char_(){c=0;diff=0;}char_::char_(charx){c=std::tolower(x);diff=c-x;}voidcharswap(char_&x,char_&y){char_temp;temp=x;x=y;y=temp;}intmain(){st

c++ - `(c = *str) != 0` 是什么意思?

intequiv(char,char);intnmatches(char*str,charcomp){charc;intn=0;while((c=*str)!=0){if(equiv(c,comp)!=0)n++;str++;}return(n);}“(c=*str)!=0”到底是什么意思?有人可以向我解释一下或帮助我提供正确的术语以自己搜索解释吗? 最佳答案 这个表达式有两部分:c=*str-这是通过取消引用指针对c的简单赋值,val!=0-这是与零的比较。这是可行的,因为赋值是一个表达式,即它有一个值。赋值的值与被赋值的值相同,

c++ - boost::split:如何用字符拆分字符串?

我被这个简单的问题困住了。假设我有一个由字符[0-9]组成的字符串。我想做的是使用boost::split将字符串拆分为单个字符。std::stringstr="0102725";std::vectorstr2;boost::split(str2,str,boost::is_any_of(SOMETHING));我正在寻找一些东西,以便str2[0]包含“0”,str2[1]包含“1”,str2[2]包含“0”等等。到目前为止,我已经尝试过“”、“:”和“:”,但没有运气...... 最佳答案 boost::split太过分了。fo