在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;i std::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;