STL映射查找第一个不可重复的字符
STL map to find the first non repeatable character
我写了一个小的 C++ 程序来计算字母表。
我正在使用 stl 地图,
有趣的是,我没有得到输入中显示的列表。
例如对于单词 TESTER,我的程序应该给出
T 2
E 2
S 1
R 1
但它给予,
E 2
R 1
S 1
T 2
改变字母的位置,
我想要输入中出现的 o/p 字母表。如果我遗漏了请帮助我 anything.Here 是我的代码
#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 != '[=12=]' )
{
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;
}
您没有注意到 std::map
有自己的内部顺序,它完全独立于添加元素的顺序。从您的示例中可以看出,它是按字母顺序排列的。这是按 char
键值的升序排列。
另请注意,您的地图操作过于复杂。您只需
char *str = "TESTER";
map<char,int> checkmap;
while( *str != '[=10=]' )
{
checkmap[*str]++;
++str;
}
while
如果您喜欢那种东西,可以进一步折叠:
while( *str != '[=11=]' ) checkmap[*str++]++;
有关在保持插入顺序的同时映射值的一般问题,请参阅A std::map that keep track of the order of insertion?
无法跟踪元素添加到地图的顺序。要获得相同的顺序,建议使用 std::vector<std::char, int>
然后更新相同的顺序。
这里显示了如何完成的方法
#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
我写了一个小的 C++ 程序来计算字母表。 我正在使用 stl 地图,
有趣的是,我没有得到输入中显示的列表。 例如对于单词 TESTER,我的程序应该给出
T 2
E 2
S 1
R 1
但它给予,
E 2
R 1
S 1
T 2
改变字母的位置,
我想要输入中出现的 o/p 字母表。如果我遗漏了请帮助我 anything.Here 是我的代码
#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 != '[=12=]' )
{
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;
}
您没有注意到 std::map
有自己的内部顺序,它完全独立于添加元素的顺序。从您的示例中可以看出,它是按字母顺序排列的。这是按 char
键值的升序排列。
另请注意,您的地图操作过于复杂。您只需
char *str = "TESTER";
map<char,int> checkmap;
while( *str != '[=10=]' )
{
checkmap[*str]++;
++str;
}
while
如果您喜欢那种东西,可以进一步折叠:
while( *str != '[=11=]' ) checkmap[*str++]++;
有关在保持插入顺序的同时映射值的一般问题,请参阅A std::map that keep track of the order of insertion?
无法跟踪元素添加到地图的顺序。要获得相同的顺序,建议使用 std::vector<std::char, int>
然后更新相同的顺序。
这里显示了如何完成的方法
#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