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

时间:2015-05-28 10:14:38

标签: c++ stl

我写了一个小的C ++程序来保存字母表的数量。 我正在使用stl map,

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

T  2
E  2
S  1
R  1

但它的给予,

E       2
R       1
S       1
T       2

更改字母的位置,

我想要输入中出现的字母的o / 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 != '\0' )
    {
        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;
}

3 个答案:

答案 0 :(得分:5)

以下是一种如何完成的方法

#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

答案 1 :(得分:1)

您错过SELECT id, number, count, name FROM temp AS t1 WHERE (SELECT COUNT(*) FROM temp AS t2 WHERE t2.number = t1.number AND t2.count > t1.count ) = 0 AND id NOT IN (SELECT id FROM temp WHERE count < 3)有自己的内部排序,这完全独立于添加元素的顺序。从您的示例中可以看出,它按字母顺序排序。这是std::map键值的递增顺序。

另请注意,您的地图操作过于复杂。您需要做的就是

char

char *str = "TESTER"; map<char,int> checkmap; while( *str != '\0' ) { checkmap[*str]++; ++str; } 如果您遇到这种情况,可能会进一步崩溃:

while

有关在维护广告订单时映射值的一般问题,请参阅A std::map that keep track of the order of insertion?

答案 2 :(得分:0)

无法跟踪将元素添加到地图的顺序。要获得相同的顺序,建议使用std::vector<std::char, int>然后更新相同的内容。