• c++字符串操作


    1. string转map

    主要用到 std::getline()std::ws

    #include <map>
    #include <string>
    #include <sstream>
    #include <iostream>
    
    std::map<std::string, std::string> mappify1(std::string const& s)
    {
        std::map<std::string, std::string> m;
    
        std::string key, val;
        std::istringstream iss(s);
    
        // iss >> std::ws 将流的前导空格去掉
        while(std::getline(std::getline(iss >> std::ws, key, ':') >> std::ws, val))
            m[key] = val;
    
        return m;
    }
    
    std::map<std::string, std::string> mappify2(std::string const& s)
    {
        std::map<std::string, std::string> m;
    
        std::string::size_type key_pos = 0;
        std::string::size_type key_end;
        std::string::size_type val_pos;
        std::string::size_type val_end;
    
        while((key_end = s.find(':', key_pos)) != std::string::npos)
        {
            if((val_pos = s.find_first_not_of(": ", key_end)) == std::string::npos)
                break;
    
            val_end = s.find('
    ', val_pos);
            m.emplace(s.substr(key_pos, key_end - key_pos), s.substr(val_pos, val_end - val_pos));
    
            key_pos = val_end;
            if(key_pos != std::string::npos)
                ++key_pos;
        }
    
        return m;
    }
    
    int main()
    {
        std::string s = "CA: ABCD
    CB: ABFG
    CC: AFBV
    CD: 4567";
    
        std::cout << "mappify1: " << '
    ';
    
        auto m = mappify1(s);
        for(auto const& p: m)
            std::cout << '{' << p.first << " => " << p.second << '}' << '
    ';
    
        std::cout << "mappify2: " << '
    ';
    
        m = mappify2(s);
        for(auto const& p: m)
            std::cout << '{' << p.first << " => " << p.second << '}' << '
    ';
    }
    

    2. trim std::string

    简单的rtirm1

    std::string s
    s.earse(s.find_last_not_of(" 
    
    	") + 1);
    

    比较通用的一个https://stackoverflow.com/a/217605

    #include <algorithm>
    #include <cctype>
    #include <locale>
    
    // trim from start (in place)
    static inline void ltrim(std::string &s) {
        s.erase(s.begin(), std::find_if(s.begin(), s.end(), [](unsigned char ch) {
            return !std::isspace(ch);
        }));
    }
    
    // trim from end (in place)
    static inline void rtrim(std::string &s) {
        s.erase(std::find_if(s.rbegin(), s.rend(), [](unsigned char ch) {
            return !std::isspace(ch);
        }).base(), s.end());
    }
    
    // trim from both ends (in place)
    static inline void trim(std::string &s) {
        ltrim(s);
        rtrim(s);
    }
    
    // trim from start (copying)
    static inline std::string ltrim_copy(std::string s) {
        ltrim(s);
        return s;
    }
    
    // trim from end (copying)
    static inline std::string rtrim_copy(std::string s) {
        rtrim(s);
        return s;
    }
    
    // trim from both ends (copying)
    static inline std::string trim_copy(std::string s) {
        trim(s);
        return s;
    }
    

    boost提供的

    #include <boost/algorithm/string.hpp>
    
    string str1="     hello world!     ";
    string str2=trim_left_copy(str1);   // str2 == "hello world!     "
    string str3=trim_right_copy(str1);  // str3 == "     hello world!"
    trim(str1);                         // str1 == "hello world!"
    
    string phone="00423333444";
    // remove leading 0 from the phone number
    trim_left_if(phone,is_any_of("0")); // phone == "423333444"
    
    
    std::string str("hello world! ");
    boost::trim_right(str);
    boost::trim_left(str);
    boost::trim(str);
    
    
  • 相关阅读:
    第几天?
    比较 String,StringBuffer,StringBuilder
    Elasticsearch中一些重要概念
    Elasticsearch 中的 Bucket
    Elasticsearch的倒排索引
    配置SSL、TLS以及HTTPS来确保es、kibana、beats、logstash的安全
    ELK集群设置X-pack密码
    logstash启动时找不到自定义的JAVA_HOME环境变量
    elasticsearch启动时使用自带的JAVA版本
    ES破解x-pack
  • 原文地址:https://www.cnblogs.com/suntus/p/15201370.html
Copyright © 2020-2023  润新知