在c+;中使用哈希映射查找字符串中的第一个唯一元素时出现问题+; int firstUniqChar(std::string s){ //使用映射查找字符串的第一个唯一字符 int string_len; int pos; std::无序的_映射m{}; 字符串_len=s.size(); 对于(int i=0;i秒==1){ int index=std::distance(m.begin(),it); 收益指数; } } 返回-1; } 我试图在C++中使用映射找到字符串中的第一个唯一元素。虽然我能够计算元素的频率,但代码不会返回第一个唯一的元素。与地图中的排序有关。如何获得第一个唯一元素

在c+;中使用哈希映射查找字符串中的第一个唯一元素时出现问题+; int firstUniqChar(std::string s){ //使用映射查找字符串的第一个唯一字符 int string_len; int pos; std::无序的_映射m{}; 字符串_len=s.size(); 对于(int i=0;i秒==1){ int index=std::distance(m.begin(),it); 收益指数; } } 返回-1; } 我试图在C++中使用映射找到字符串中的第一个唯一元素。虽然我能够计算元素的频率,但代码不会返回第一个唯一的元素。与地图中的排序有关。如何获得第一个唯一元素,c++,c++14,C++,C++14,使用数组添加另一个代码,该数组不能覆盖所有情况 int firstUniqChar(std::string s) { //Using maps to find the first unique character of the string int string_len; int pos; std::unordered_map<char, int> m{}; string_len = s.size(); for (int i = 0;

使用数组添加另一个代码,该数组不能覆盖所有情况

int firstUniqChar(std::string s) {
    //Using maps to find the first unique character of the string
    int string_len;
    int pos;
    std::unordered_map<char, int> m{};
    string_len = s.size();

    for (int i = 0; i < string_len; i++) {
        //if the char in string is not present in map, then add to the map with a 
        //frequency of 1.
        if(m.find(s[i]) == m.end()) {
            m.insert(std::make_pair(s[i], 1));
        } else {
            m[s[i]]++;            
        }
    }     
    
    for(std::unordered_map<char, int>::iterator it = m.begin(); it != m.end(); ++it) {
        if (it->second == 1) {
           int index = std::distance(m.begin(), it);                
            return index;
        }
    }

    return -1;
}
intmain(){
std::string s=“aadadaad”;
int len=s.length();
如果(len==1){
返回0;
}
对于(int i=0;istd::cout返回的是无序映射的第一个元素。第一个元素与字符串的第一个唯一元素无关

您应该做的是,一旦计算了频率,再次迭代字符串并返回频率为1的第一个字符



另外,如果您可以假设一个8位字节(这可能是一个合理的假设),那么只有256个不同的值。与哈希映射不同,一个可能更有效的解决方案是使用256个元素的数组。请注意,您需要转换为无符号字符以使用字符作为索引。

代码返回什么?“First”对于无序容器没有实际意义。元素的顺序未指定,并且除了容器的实现之外没有其他意义。如果您试图按照插入顺序查找第一个元素,则无法使用关联容器。关联容器顺序的安排可加快搜索速度并丢失s有关插入顺序的所有信息。@DeepakPatankar代码返回插入顺序中的第一个唯一元素string@FrançoisAndrieux散列映射是我能够有效计算重复元素频率的唯一方法。我已经看过java和python的实现。如果java或python已经实现了,在C++@AnjanaRajam中,这似乎对我不起作用h容器报告其元素的插入顺序,然后在内部隐藏其他数据结构。哈希映射无法跟踪插入顺序。插入顺序需要在单独的容器中跟踪,或者可能与每个元素一起嵌入,代价是非常缓慢的迭代。这就是我正在做的。我返回第一个ch频率为1的字符。但第一个字符不会显示为第一个字符,而是随机放置在其他位置。这就是它的方向wrong@AnjanaRajam
这就是我要做的。我返回的是频率为1的第一个字符。
您返回的是无序映射的第一个字符,是的。据我所知,这不是你的函数应该返回。你不应该返回字符串的第一个唯一字符吗?就像hashmap一样,数组并不能覆盖所有的角大小写。我试过了。@AnjanaRajam你认为数组不能覆盖哪个角?我返回的是频率为1的第一个字符,而不是第一个字符。它->秒==1不是but频率。但正如我所说,频率为1的第一个字符随机放置在其他位置,因此结果不正确
int main() {
std::string s = "aadadaad";
int len = s.length();

if (len == 1) {
    return 0;
}

for (int i = 0; i < len; i++) {
    bool found = true;
    for (int j = i + 1; j < len; j++) {
        if (s[i] == s[j]) {
            found = false;
            break;
        }
    }

    if ((i != len - 1) && (found == true)) {
        std::cout << i << std::endl;
        return i;
    }
}

std::cout << "-1" << std::endl;
return -1;