【问题标题】:STL map to find the first non repeatable character查找第一个不可重复字符的 STL 映射
【发布时间】:2015-05-28 10:14:37
【问题描述】:

我编写了一个小型 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;
}

【问题讨论】:

标签: c++ stl


【解决方案1】:

这里展示了一种方法如何完成

#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

【讨论】:

  • @juanchopanza 我只是重复了我对其他类似问题的旧答案。唯一的区别是使用了 std:;string 对象而不是字符串文字。因此,我使用了成员函数 find.:) 而不是标准函数 strchr
  • 有点遗憾的是,order lambda 如此昂贵(每次调用 O(N))。
  • @MSalters 你有什么建议?
  • std::strchr(str,c) 可以被记忆。如果我有一个简单的建议如何做到这一点,我会提供它。但我担心你会需要一个size_t[UCHAR_MAX],这反过来意味着你的 lambda 必须成为一个有状态的仿函数。
【解决方案2】:

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

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

char *str = "TESTER";
map<char,int> checkmap;

while( *str != '\0' )
{
    checkmap[*str]++;
    ++str;
}

while 如果你喜欢这种东西,可以进一步折叠:

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

关于在保持插入顺序的同时映射值的一般问题,请参阅A std::map that keep track of the order of insertion?

【讨论】:

  • 谢谢@juanchopanza 有什么办法可以得到输入中出现的字母吗?
  • @Rndp13 不简单。您可以将元素推送到 pair&lt;char, int&gt; 的向量中,并且仅在该对的第一个元素不存在时才推送新元素。
【解决方案3】:

无法跟踪元素添加到地图的顺序。要获得相同的订单,建议使用std::vector&lt;std::char, int&gt;,然后进行更新。

【讨论】:

    猜你喜欢
    • 2011-01-18
    • 2012-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    • 1970-01-01
    相关资源
    最近更新 更多