C++如何获取字符串第n个字符并适配std::map<string,string>查询
问题
我需要获取字符串的第n个字符,常规写法char current_letter = input_string[j];能拿到单个字符,但用std::string current_letter = &input_string[j];时,得到的是从索引j开始的整个子串而非单个字符。如果把current_letter改成char类型,同时将std::map的键类型改为char,调用find()会出现重载不匹配错误:no instance of overloaded function "std::map<_Key, _Tp, _Compare, _Alloc>::find [...] matches the argument list。我希望保持std::map的键和值均为std::string,请问如何正确获取单个字符以适配该map的查询?
相关输出
0 current_letter: ABC 1 current_letter: BC 2 current_letter: C ABC BC 9ekNc5GlorW1PkaBQlYCuXMBljdSQClygl00XwKxoVzYsf8FrCs3qUZV85gHJHsl
相关代码
#include <iostream> #include <algorithm> #include <vector> #include <map> #include <string> void set_seed_n_shuffle(std::vector<std::string> &array, unsigned seed){ std::srand(seed); random_shuffle(std::begin(array), std::end(array)); } std::string en_to_ch(std::vector<std::string> list, std::string input_string){ std::vector<std::string> en_list = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J"}; std::map<std::string, std::string> en_ch_dict; for (int i=0; i<en_list.size(); i++){ en_ch_dict.insert(std::pair<std::string, std::string>(en_list[i], list[i])); } std::string coded_string; for (int j=0; j<input_string.size(); j++){ std::string current_letter = &input_string[j]; std::cout << j << " current_letter: " << current_letter << "\n"; if (en_ch_dict.find(current_letter) == en_ch_dict.end()) { coded_string += current_letter + " "; } else { coded_string += en_ch_dict.find(current_letter)->second + " "; } } return coded_string; } int main(){ std::vector<std::string> ch_list = {"randomcharacters1", "randomcharacters2","randomcharacters3","randomcharacters4","randomcharacters5"}; set_seed_n_shuffle(ch_list, 156); std::string string_input = "ABC"; std::string new_string = en_to_ch(ch_list, string_input); std::cout << new_string << "\n"; }
解决方案
核心问题原因
&input_string[j]返回的是char*类型,当用它初始化std::string时,会把从索引j开始到字符串末尾的所有字符当成C风格字符串来构造,所以得到的是子串而非单个字符。
三种可行的修正方法
- 直接构造单字符std::string:利用
std::string的构造函数,传入单个字符和长度1std::string current_letter(1, input_string[j]); - 使用substr方法截取单个字符:调用
std::string的substr方法,从索引j开始截取长度为1的子串std::string current_letter = input_string.substr(j, 1); - emplace构造字符串(C++11及以上):用
emplace直接构造单字符字符串,效率略高std::string current_letter; current_letter.emplace_back(input_string[j]);
修改后的完整代码示例
#include <iostream> #include <algorithm> #include <vector> #include <map> #include <string> void set_seed_n_shuffle(std::vector<std::string> &array, unsigned seed){ std::srand(seed); random_shuffle(std::begin(array), std::end(array)); } std::string en_to_ch(std::vector<std::string> list, std::string input_string){ std::vector<std::string> en_list = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J"}; std::map<std::string, std::string> en_ch_dict; for (int i=0; i<en_list.size(); i++){ en_ch_dict.insert(std::pair<std::string, std::string>(en_list[i], list[i])); } std::string coded_string; for (int j=0; j<input_string.size(); j++){ // 用构造函数生成单字符字符串 std::string current_letter(1, input_string[j]); std::cout << j << " current_letter: " << current_letter << "\n"; if (en_ch_dict.find(current_letter) == en_ch_dict.end()) { coded_string += current_letter + " "; } else { coded_string += en_ch_dict.find(current_letter)->second + " "; } } return coded_string; } int main(){ std::vector<std::string> ch_list = {"randomcharacters1", "randomcharacters2","randomcharacters3","randomcharacters4","randomcharacters5"}; set_seed_n_shuffle(ch_list, 156); std::string string_input = "ABC"; std::string new_string = en_to_ch(ch_list, string_input); std::cout << new_string << "\n"; }
效果说明
修改后,current_letter会被正确初始化为单个字符的std::string,可以正常匹配std::map<std::string, std::string>的键类型,find()方法也能正确执行,不会再出现重载不匹配的错误。
内容的提问来源于stack exchange,提问作者yes
相关产品推荐
相关产品推荐

