STL映射查找第一个不可重复的字符

STL map to find the first non repeatable character

本文关键字:字符 映射 查找 第一个 STL      更新时间:2023-10-16

我写了一个小的c++程序来记录字母表的数目。我使用stl映射相同的,

有趣的是,我没有得到列表,因为它出现在输入。例如,对于单词TESTER,我的程序应该给出

T  2
E  2
S  1
R  1

但这是给予,

E       2
R       1
S       1
T       2

改变字母的位置

我想要输入中出现的字母的0/p。请帮助我,如果我错过了什么。这是我的代码

#include<iostream>
#include<map>
using namespace std;
int main()
{
    char *str = "TESTER";
    map<char,int> checkmap;
    map<char,int>::iterator p;
    int i;
    while( *str != '' )
    {
        p = checkmap.find(*str);
        i = p->second;
        if(p == checkmap.end())
        {
            checkmap.insert(std::make_pair(*str,++i));
        }
        else
        {
            p->second = ++(p->second);
        }
    str++;
    }
    for(p=checkmap.begin(); p!=checkmap.end(); p++)
    {
        /*if(p->second == 1)
        {
            cout<<(*p).first<<endl;
        }*/
        cout<<p->first<<"t"<<p->second<<endl;
    }
    return 0;
}

这里展示了如何完成的方法

#include <iostream>
#include <map>
#include <cstring>
int main() 
{
    const char *str = "TESTER";
    auto order = [&]( char c1, char c2 )
    {
        return ( std::strchr( str, c1 ) < std::strchr( str, c2 ) );
    };
    std::map<char, int, decltype( order )> m( order );
    for ( const char *p = str; *p; ++p ) ++m[*p];
    for ( const auto &p : m ) std::cout << p.first << ' ' << p.second << std::endl;
    std::cout << std::endl;
    return 0;
}

程序输出为

T 2
E 2
S 1
R 1

您忽略了std::map有自己的内部排序,它完全独立于添加元素的顺序。从示例中可以看到,它是按字母顺序排列的。这是按char键的值递增的顺序。

还要注意,您的映射操作过于复杂。你所需要做的就是

char *str = "TESTER";
map<char,int> checkmap;
while( *str != '' )
{
    checkmap[*str]++;
    ++str;
}

如果你对这种事情感兴趣,while可以进一步崩溃:

while( *str != '' ) checkmap[*str++]++;

关于在保持插入顺序的同时映射值的一般问题,请参见跟踪插入顺序的std::map ?

没有办法跟踪元素添加到映射中的顺序。要获得相同的顺序,建议使用std::vector<std::char, int>,然后更新相同的。