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.