我正在尝试解决一个问题,即我将字符插入到<char, int>
类型的地图中。如果char已经存在于map中,我会将int增加1.我已经创建了自己的比较器来优先处理map中的元素。优先级不会以我希望它的工作方式起作用,因为最终输出不遵循命令。
#include <iostream>
#include <string>
#include <map>
#include <iterator>
using namespace std;
struct classcomp {
bool operator()(const int& a, const int& b) const {
return a < b;
}
};
bool isPresent(map<char,int,classcomp> mymap, char c){
return (mymap.find('b') != mymap.end());
}
int main(){
string input="dadbadddddddcabca";
map<char,int,classcomp> mymap;
char temp;
for(string::iterator it = input.begin(); it!=input.end(); ++it){
temp = *it;
if(!isPresent(mymap, temp))
mymap.insert(pair<char,int>(*it,1));
else
mymap[temp]++;
}
for (auto& x: mymap) {
cout << x.first << ": " << x.second << '\n';
}
return 0;
}
提供以下输出:
a: 4
b: 2
c: 2
d: 8
答案 0 :(得分:2)
比较器用于对char
s而不是int
进行排序。
它正在对键进行排序,似乎工作得很好 - a b c d
。
答案 1 :(得分:2)
std :: map旨在按键排序,为值类型提供比较器不会改变任何内容。想象你有std::map<char,char>
,你怎么认为你可以提供价值比较器(如果可能的话)?
因此,解决方案是使用容器,允许按多个键排序,如boost :: multi_index或只创建另一个映射 - 反转:
#include <iostream>
#include <string>
#include <map>
#include <iterator>
using namespace std;
int main(){
string input="dadbadddddddcabca";
map<char,int> mymap;
for(string::iterator it = input.begin(); it!=input.end(); ++it){
mymap[*it]++;
}
map<int,char> reversemap;
for (auto& x: mymap) {
reversemap.insert( make_pair( x.second, x.first ) );
}
for (auto& x: reversemap ) {
cout << x.first << ": " << x.second << '\n';
}
return 0;
}
请注意,对元素存在的预检查是完全冗余的,std :: map operator []创建新元素并初始化它(如果它不存在)。 你可能会注意到在输出中你现在缺少一些值(虽然它们已被排序),如果这不是你需要的,可以将reversemap类型从map更改为multimap,这允许重复密钥。
答案 2 :(得分:1)
map
按键而不是值对其条目进行排序。 char
密钥会在int
classcomp::operator()
的形式静默投放
答案 3 :(得分:1)
为什么
mymap.find('b') != mymap.end());
而不是
mymap.find(c) != mymap.end());
答案 4 :(得分:0)
地图按其按键排序。
您的自定义比较器classcomp
将应用于键而非值。
答案 5 :(得分:0)
也许这就是你想要的
int main() {
std::string input="dadbadddddddcabca";
typedef std::map< char, int > map_t;
map_t mymap;
char temp;
for ( std::string::const_iterator it = input.begin(), e = input.end(); it != e; ++it ) {
temp = *it;
mymap[ temp ] = mymap[ temp ] + 1; // Hopufuly operator[] inserts zero initialized value, if can't find a key
}
typedef std::pair< typename map_t::key_type, typename map_t::mapped_type > pair_t;
std::vector< pair_t > sortedByValue;
sortedByValue.assign( mymap.begin(), mymap.end() );
std::sort( sortedByValue.begin(), sortedByValue.end(), []( const pair_t & left, const pair_t & right ) {
return left.second < right.second;
// change to
// return left.second > right.second;
// for descend order
} );
for ( const auto & x: sortedByValue ) {
std::cout << x.first << ": " << x.second << std::endl;
}
}