C++ string的那些坑,C++ string功能补充(类型互转,分割,合并,瘦身) ,c++ string的内存本质(简单明了的一个测试)
Posted 朝闻道
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ string的那些坑,C++ string功能补充(类型互转,分割,合并,瘦身) ,c++ string的内存本质(简单明了的一个测试)相关的知识,希望对你有一定的参考价值。
1. size_type find_first_of( const basic_string &str, size_type index = 0 );
查找在字符串中第一个与str中的某个字符匹配的字符,返回它的位置。搜索从index开始,如果没找到就返回string::npos
2. string& replace (size_t pos, size_t len, const string& str);
从当前字符串的pos位置开始,长度为len的段落,替换成成str
3. int compare (const string& str)
结果为0,表示字符串相等,等价于字符串间的=
4. data()与c_str()的区别
data()是指返回字符数组,尾部可能有\'\\0\',也可能没有.
c_str()是指返回C兼容的字符串,尾部肯定有\'\\0\'
5. at()与[]的区别
[]没有检查越界,不会抛出异常,效率高
at()检查越界,抛出异常,安全度高
6.size_t copy (char* s, size_t len, size_t pos = 0) const;
int StringUtil::intFromString(string data) { //NOTE atoi是非标准C函数 return atoi(data.c_str()); } string StringUtil::stringFromInt(int data) { char tmp[11]; memset(tmp,0,11); sprintf(tmp,"%10d",data); return string(tmp); } double StringUtil::doubleFromString(string data) { double tmp; sscanf(data.c_str(),"%lf",&tmp); return tmp; } string StringUtil::stringFromDouble(double data) { char tmp[21]; memset(tmp,0,21); sprintf(tmp,"%20.3lf",data); return string(tmp); } float StringUtil::floatFromString(std::string data) { float tmp; sscanf(data.c_str(),"%f",&tmp); return tmp; } std::string StringUtil::stringFromFloat(float data) { char tmp[21]; memset(tmp,0,21); sprintf(tmp,"%20.3f",data); return string(tmp); } bool StringUtil::boolFromString(std::string data) { if(data.compare("true") == 0) return true; else return false; } std::string StringUtil::stringFromBool(bool data) { if(data) return string("true"); else return string("false"); } vector<std::string> StringUtil::splitStringToArray(std::string source, std::string seperator) { vector<string> result; if(!source.empty()) { string::size_type begin = 0; string::size_type end = 0; unsigned int sepSize = seperator.size(); while((end = source.find_first_of(seperator,begin))!=string::npos) { string item = source.substr(begin,end-begin); result.push_back(item); begin=end + sepSize; } //last item,注意如果最后是分割符,则最后的元素为空字符串 if(begin <= source.size()) { string item = source.substr(begin,source.size() - begin); result.push_back(item); } } return result; } std::string StringUtil::linkArrayToString(vector<std::string> array, std::string seperator) { string result; if(array.size() > 0) { unsigned int limit = array.size() - 1; for(unsigned int i=0;i< limit;++i) { result+=array[i]; result+=seperator; } result += array[limit]; } return result; } map<std::string, std::string> StringUtil::splitStringToMap(std::string source, std::string primarySep, std::string secondarySep) { vector<string> array = StringUtil::splitStringToArray(source,primarySep); vector<string> tmpArray; map<string,string> result; for(unsigned int i = 0; i< array.size();++i) { tmpArray = StringUtil::splitStringToArray(array[i],secondarySep); if(tmpArray.size() >= 2) { result[tmpArray[0]] = tmpArray[1]; } } return result; } std::string StringUtil::linkMapToString(map<std::string, std::string> tmpMap, std::string primarySep, std::string secondarySep) { vector<string> tmpArray; string tmpStr; map<string,string>::iterator it = tmpMap.begin(); for(;it!=tmpMap.end();++it) { tmpStr = it->first+secondarySep+it->second; tmpArray.push_back(tmpStr); } return StringUtil::linkArrayToString(tmpArray,primarySep); } std::string StringUtil::trimFront(std::string data) { unsigned int i = 0; for(;i<data.size()&&data.at(i)==\' \';++i) { } if(i<data.size()) return data.substr(i,data.size()-i); else return string(""); } std::string StringUtil::trimBack(std::string data) { int i = data.size()-1; for(;i>=0&&data.at(i)==\' \';--i) { } if(i>=0) return data.substr(0,i+1); else return string(""); } std::string StringUtil::trim(std::string data) { string tmp = StringUtil::trimFront(data); return StringUtil::trimBack(tmp); }
http://www.cnblogs.com/guoxiaoqian/p/4113339.html
虽然没有研究过string的源代码,不过可以确定的是string的内存空间是在堆上开辟的,它自己负责释放空间,不用我们关系。
我们用一个动态分配的字符串指针初始化一个string对象retStr,它会做一个拷贝过程,将字符串考到retStr自己的内存空间里,之后retStr就跟ret没有任何关系了,因此我们要记得释放ret:
1 char* ret = (char*)malloc(len_str); 2 memset(ret,0,len_str); 3 //operate ret ... 4 string retStr(ret); 5 free(ret);
http://www.cnblogs.com/guoxiaoqian/p/3944805.html
以上是关于C++ string的那些坑,C++ string功能补充(类型互转,分割,合并,瘦身) ,c++ string的内存本质(简单明了的一个测试)的主要内容,如果未能解决你的问题,请参考以下文章
C++:Copy-On-Write技术以及string类的模拟实现
C++ : C++基础 :从内存的角度看 char[]和char*