You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的构造函数,传入单个字符和长度1
    std::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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 12:40:50