zoukankan      html  css  js  c++  java
  • 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()是指返回字符数组,尾部可能有'',也可能没有.

    c_str()是指返回C兼容的字符串,尾部肯定有''

    5. at()与[]的区别

    []没有检查越界,不会抛出异常,效率高

    at()检查越界,抛出异常,安全度高

    6.size_t copy (char* s, size_t len, size_t pos = 0) const;

    将strign的内容拷贝到外部的一个字符数组中,而不是将外部的字符串拷贝到string
    7.size()和length()
    size()返回string的长度,是字节数,而不是字符个数。string无视内部字符采用的是何种编码方式,它都当成字节集合来处理。size()和length()功能和意义一样,前者是为了配合STL标准加的接口。
    http://www.cnblogs.com/guoxiaoqian/p/4275959.html
     
    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

  • 相关阅读:
    loj#6433. 「PKUSC2018」最大前缀和(状压dp)
    PKUWC2019游记
    10. Regular Expression Matching
    9. Palindrome Number
    8. String to Integer (atoi)
    7. Reverse Integer
    6. ZigZag Conversion
    5. Longest Palindromic Substring
    4. Median of Two Sorted Arrays
    3. Longest Substring Without Repeating Characters
  • 原文地址:https://www.cnblogs.com/findumars/p/7492535.html
Copyright © 2011-2022 走看看