C++精解【3】

split

c+中没有split,于是需要自己实现这个函数。

#include <iostream>
#include <vector>
#include <string>
#include <sstream>
using namespace std;
vector<string> split(const string &text, char separator) {
    vector<string> tokens;
    stringstream ss(text);
    string item;
    while (getline(ss, item, separator)) {
        if (!item.empty()) {
            tokens.push_back(item);
        }
    }
    return tokens;
}
int main() {
    string codeStr = "x:long=88;y:float=11.22;z:int=99";
    char delimiter = ';';
    vector<string> codeTokens=split(codeStr,delimiter);

    for (const std::string &codeLineToken : codeTokens) {
        cout << codeLineToken << endl;
    }
    return 0;
}

x:long=88
y:float=11.22
z:int=99

Process returned 0 (0x0)   execution time : 0.041 s
Press any key to continue.


  • getline会生成一个包含一串从输入流读入的字符的字符串,直到以下情况发生会导致生成的此字符串结束:1)到文件结束,2)遇到函数的定界符,3)输入达到最大限度。
  • 在函数遇到和结束定界符相等的字符时函数结束,同时函数抽出定界符,此种情况下该定界符既不被放回输入流,也不被放入要生成的字符串。所以由此可以理解输入结束后的第一个回车是定界符,被确认后抛弃,而第二个才是程序执行运行时正常需要的。
  • 更多 见百度百科

map

用于存储和检索集合中的数据,此集合中的每个元素均为包含数据值和排序键的元素对。 键的值是唯一的,用于自动排序数据。
更多见百度百科

基础

在C++中,map是一个关联容器,用于存储键值对,并且通过键来对数据进行排序。
下面引用自百度百科的自动生成内容:

下面是一个简单的使用map的例子:

#include <map>
#include <iostream>  
int main() {
   std::map<int, std::string> exampleMap;

   // 插入元素
   exampleMap[1] = "one";
   exampleMap[2] = "two";
   exampleMap[3] = "three";

   // 访问元素
   std::cout << "Key 2 corresponds to Value " << exampleMap[2] << std::endl;

   // 遍历元素
   for (const auto& pair : exampleMap) {
       std::cout << "Key: " << pair.first << " Value: " << pair.second << std::endl;
   }

   return 0; } ```这段代码展示了如何创建一个map,如何插入元素,如何通过键访问元素,以及如何遍历map中的所有键值对。

实战

整型变量符号表

//value_type
//存储为 map 中的元素的对象的类型。
typedef pair<const Key, Type> value_type;
#include <iostream>
#include <string>
#include <map>
using namespace std;
typedef map<string, int> TableIntMap;
int main()
    {
    TableIntMap intSymbols;

    intSymbols.insert(TableIntMap::value_type("a1", 1));
    intSymbols.insert(TableIntMap::value_type("a2", 2));
    intSymbols.insert(TableIntMap::value_type("a3", 3));

// find and show elements
    cout << "intSymbols.at('a1') == " << intSymbols.at("a1") << endl;
    cout << "intSymbols.at('a2') == " << intSymbols.at("a2") << endl;
    cout << "intSymbols.at('a3') == " << intSymbols.at("a3") << endl;

    return (0);
    }

intSymbols.at('a1') == 1
intSymbols.at('a2') == 2
intSymbols.at('a3') == 3

Process returned 0 (0x0)   execution time : 0.132 s
Press any key to continue.

简单分析生成整型变量表

#include <iostream>
#include <map>
#include <vector>
#include <string>
#include <sstream>
#include <algorithm>

using namespace std;
typedef map<string, int> TableIntMap;

vector<string> split(const string &text, char separator) {
    vector<string> tokens;
    stringstream ss(text);
    string item;
    while (getline(ss, item, separator)) {
        if (!item.empty()) {
            tokens.push_back(item);
        }
    }
    return tokens;
}

string removeSpaces(const string& input) {
    string result = input;
    result.erase(std::remove(result.begin(), result.end(), ' '), result.end());
    return result;
}

int main(){
    string codeStr = "x:int=88;y:int=11;z:int=99";
    char delimiter = ';';
    vector<string> codeTokens=split(codeStr,delimiter);
    TableIntMap intSymbols;
    vector<string> symbolTokens,sysmbolVarTokens;
    for (const std::string &codeLineToken : codeTokens) {
        delimiter = '=';
        symbolTokens=split(codeLineToken,delimiter);
        delimiter = ':';
        sysmbolVarTokens=split(symbolTokens[0],delimiter);
        if (removeSpaces(sysmbolVarTokens[1])=="int"){
            string intSysbol=removeSpaces(sysmbolVarTokens[0]);
            int intValue=stoi(removeSpaces(symbolTokens[1]));
            intSymbols.insert(TableIntMap::value_type(intSysbol, intValue));

        }
   }
   cout<<"int "<<endl;
    for (const auto& elem : intSymbols) {
        cout << " [" << elem.first << ": " << elem.second << "]"<<endl;
    }

    return (0);
}

int
 [x: 88]
 [y: 11]
 [z: 99]

Process returned 0 (0x0)   execution time : 0.037 s
Press any key to continue.


  • 15
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值