工程中用到了不少string的操作,总结了一下,分享学习成果。
1.替换函数,将str中的old_value替换为new_value
string& replace_all_distinct(string& str, const string& old_value, const string& new_value) { for (string::size_type pos(0); pos != string::npos; pos += new_value.length()) { if ((pos = str.find(old_value, pos)) != string::npos) str.replace(pos, old_value.length(), new_value); else break; } return str; }
测试过程:
string str = "abc_M_DDE_XXf_**PLoT_n_pq_df_cx-*9900))"; cout << str << endl; string str2 = replace_all_distinct(str, "*", ""); cout << str2 << endl;
输出结果:
abc_M_DDE_XXf_**PLoT_n_pq_df_cx-*9900)) abc_M_DDE_XXf_PLoT_n_pq_df_cx-9900))
将*替换为空,该函数只能一个一个的替换,如果有多个想要替换的对象,请多次调用函数吧。
2.字符串分割函数
vector<std::string> split(std::string str, std::string pattern) { std::string::size_type pos; vector<std::string> result; str += pattern;//扩展字符串以方便操作 int size = str.size(); for (int i = 0; i<size; i++) { pos = str.find(pattern, i); if (pos<size) { std::string s = str.substr(i, pos - i); result.push_back(s); i = pos + pattern.size() - 1; } } return result; }
测试过程:
string str = "abc_M_DDE_XXf_**PLoT_n_pq_df_cx-*9900))"; cout << str << endl; vector<string> s_vector = split(str, "_"); for (int i = 0; i < s_vector.size(); i++) { cout << s_vector[i] << endl; }
测试结果:
abc_M_DDE_XXf_**PLoT_n_pq_df_cx-*9900)) abc M DDE XXf **PLoT n pq df cx-*9900))
该函数是替换str中的pattern,存在一个vector<string>中。
3.转为大写
string toUpper(string s) { transform(s.begin(), s.end(), s.begin(), ::toupper); return s; }
注意:需要添加头文件#include<algorithm>
测试过程:
vector<string> s_vector = split(str, "_"); for (int i = 0; i < s_vector.size(); i++) { cout << (s_vector[i]) << endl; cout << toUpper(s_vector[i]) << endl; }
测试结果:
abc ABC M M DDE DDE XXf XXF **PLoT **PLOT n N pq PQ df DF cx-*9900)) CX-*9900))
transform是algorithm自带函数。
4.转为小写
string toLower(string s) { transform(s.begin(), s.end(), s.begin(), ::tolower); return s; }
5.判断字符串的包含关系
bool contain(string srcStr, string containStr) { if (srcStr.find(containStr) < srcStr.length()) { return true; } else { return false; } }
测试过程:
bool isOK = contain(str, "ab"); cout << isOK << endl;
输出:
1
5.double转string,结果四舍五入
string getStringFromDouble(double input, int saveDigit) { stringstream ss; ss << fixed; if (saveDigit >= 0) { ss.precision(saveDigit); } ss << input; string output; ss >> output; ss.clear(); return output; }
测试过程:
string ss = getStringFromDouble(2.543621, 3); cout << ss << endl;
输出:
2.544
6.获取随机字符串
string getRandomString(int length) { const int LEN = 62; // 26 + 26 + 10 char g_arrCharElem[LEN] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' }; if (length>0) { char* szStr = new char[length + 1]; szStr[length] = '\0'; //srand((unsigned)GetTickCount()); int iRand = 0; for (int i = 0; i < length; ++i) { iRand = rand() % LEN; szStr[i] = g_arrCharElem[iRand]; } string result = szStr; delete[] szStr; return result; } return ""; }
测试过程:
string ss2 = getRandomString(9); cout << ss2 << endl;
7.获取给定大小与数量的随机字符串,并且放到vector中
vector<string> getRandomStringVector(int vectorSize, int length) { const int LEN = 62; // 26 + 26 + 10 char g_arrCharElem[LEN] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' }; vector<string> retultVector; if (length>0) { //srand((unsigned)GetTickCount()); for (int i = 0; i<vectorSize; i++) { char* szStr = new char[length + 1]; szStr[length] = '\0'; int iRand = 0; for (int i = 0; i < length; ++i) { iRand = rand() % LEN; szStr[i] = g_arrCharElem[iRand]; } string result = szStr; delete[] szStr; retultVector.push_back(result); } } return retultVector; }
测试:
vector<string> s2_vector = getRandomStringVector(5, 5); for (int i = 0; i < s2_vector.size(); i++) { cout << s2_vector[i] << endl; }
8.去重一个vector,以map保存 key为vector内值,value为出现次数
vector<pair<string, int>> distinctVectorDouble2PairVector(vector<double> inputVector) { vector<pair<string, int>> resultVector; vector<string> tempVector; for (int i = 0; i<inputVector.size(); i++) { tempVector.push_back(getStringFromDouble(inputVector.at(i),1)); } sort(tempVector.begin(), tempVector.end(), less<string>()); string lastValue; for (int i = 0; i<tempVector.size(); i++) { if (i == 0) lastValue = tempVector.at(i); if (tempVector.at(i) == lastValue&&i != 0) { resultVector[resultVector.size() - 1].second++; } else { resultVector.push_back(pair<string, int>(tempVector.at(i), 1)); lastValue = tempVector.at(i); } } return resultVector; }
测试过程:
vector<double> inputVector; inputVector.push_back(3); inputVector.push_back(4); inputVector.push_back(5); inputVector.push_back(6); inputVector.push_back(3); vector<pair<string, int>> p_vector = distinctVectorDouble2PairVector(inputVector); for (int i = 0; i < p_vector.size();i++) { cout << p_vector[i].first <<" "<<p_vector[i].second<< endl; }
9.类型为string时,统计每个的出现次数
vector<pair<string, int>> distinctVectorString2PairVector(vector<string> inputVector) { vector<pair<string, int>> resultVector; vector<string> tempVector = inputVector; sort(tempVector.begin(), tempVector.end(), less<string>()); string lastValue; for (int i = 0; i<tempVector.size(); i++) { if (i == 0) lastValue = tempVector.at(i); if (tempVector.at(i) == lastValue&&i != 0) { resultVector[resultVector.size() - 1].second++; } else { resultVector.push_back(pair<string, int>(tempVector.at(i), 1)); lastValue = tempVector.at(i); } } return resultVector; }
测试过程:
vector<string> inputVector2; inputVector2.push_back("aa"); inputVector2.push_back("ss"); inputVector2.push_back("bb"); inputVector2.push_back("aa"); vector<pair<string, int>> p_vector2 = distinctVectorString2PairVector(inputVector2); for (int i = 0; i < p_vector2.size(); i++) { cout << p_vector2[i].first << " " << p_vector2[i].second << endl; }
输出:
aa 2 bb 1 ss 1
10.vector中找极值
void getMinMaxFromVector(vector<double> input, double& min, double& max) { if (input.size() <= 0) { min = 9999; max = -9999; } for (int i = 0; i<input.size(); i++) { if (i == 0) { min = input[i]; max = input[i]; } else { min = min>input[i] ? input[i] : min; max = max<input[i] ? input[i] : max; } } }
测试:
double min = 0, max = 0; getMinMaxFromVector(inputVector, min, max); cout << "min=" << min << " " << "max=" << max << endl;
几乎上了一天的课,早上机器学习,晚上遥感,下午做了回项目,回去睡觉了。代码重在积累,这几天把近期做过的项目好好总结一番,包括hdf影像的读写,pg数据库的入库等内容。
keep fighting!