应该是小于 *** 作符 <
因为map这一类容器需要进行两元素比较的,一般都是需要自己实现小于 *** 作,有时是<,有时是less<类型名>,具体方法你可以百度一下,我目前还没有遇到这个需求。
表述不是很清楚,不明白你的section指的什么。。。
大意看明白了,讲一下思路吧
你的问题实际上是map的嵌套,可以这样定义:
multimap<string,map<string,int> >;这里假设两个key是string类型,value是int型
这里的问题是你的第一个key可能没有,可以自己插入一个相同的,所有这里用的是multimap;
然后定义ifstream对象来打开并关联你的ini文件,用while(getline())逐行读取内容,
再定义istringstream读取单词,定义计数器计数每行的单词数。
如果是3,直接插入multimap<string,map<string,int> >
如果是2,先插入第二个map<string,int>,然后自定义一个string,与前者构造make_pair()再插入
multimap<string,map<string,int> >中
后面的就是查找,删除
最后输出时注意去掉你自定义的第一个key
以上应该够清楚了吧。。。
#include<iostream>
#include<string>
#include<map>
usingnamespacestd;
intmain()
{
multimap<string,int>m_map;
strings("中国"),s1("美国");
m_mapinsert(make_pair(s,50));
m_mapinsert(make_pair(s,55));
m_mapinsert(make_pair(s,60));
m_mapinsert(make_pair(s1,30));
m_mapinsert(make_pair(s1,20));
m_mapinsert(make_pair(s1,10));
//方式1
intk;
multimap<string,int>::iteratorm;
m=m_mapfind(s);
for(k=0;k!=m_mapcount(s);k++,m++)
cout<<m->first<<"--"<<m->second<<endl;
//方式2
multimap<string,int>::iteratorbeg,end;
beg=m_maplower_bound(s1);
end=m_mapupper_bound(s1);
for(m=beg;m!=end;m++)
cout<<m->first<<"--"<<m->second<<endl;
//方式3
beg=m_mapequal_range(s)first;
end=m_mapequal_range(s)second;
for(m=beg;m!=end;m++)
cout<<m->first<<"--"<<m->second<<endl;
return0;
}
扩展资料
map构造函数;
map<string,int>mapstring;map<int,string>mapint;
map<sring,char>mapstring;map<char,string>mapchar;
map<char,int>mapchar;map<int,char>mapint;
如在打枚举中打印“指定值对应的字符串”时,可是采用map<int,string>的STL实现。
通常 *** 作数组的时候,你发送的实参就是数组的首地址;所以直接void类型就可以;但是如果一定要设返回值的话;直接把形参接收的首地址返回就可以了!
你的代码中,有很大的问题;如果是的代码中这样设定要想不出问题,那么那个数组要在堆中分配;即malloc一块地址;
其次,int paixu() 改成int paixu();
再次;return arr;就可以
如果你的程序需要作为接口给别人的,那么你这个写法显然是不对的;因为别人不知道怎么解析你这个接口返回的地址;知道是数组也不知道数组的元素个数!
再说你这个冒泡排序;也出问题了!j不会递增,也就是当执行到里面的循环后就是个死循环!
map就是哈希表,用来储存成对的数据key和val
map<char,int> m;
minsert(make_pair('0',10));//插入数据,make_pair这个东西就要看自己体会了,实在不知道怎么解释
minsert(make_pair('1',11));
minsert(make_pair('2',12));
下面从map中读取数据,直接把key当做下标就可以得到val,只有哈希表能做这样的事情,其他如vector,list等都不行,这是哈希表最明显的特征
cout<<m['1']<<endl;输出11
cout<<m['4']<<endl;输出0
map还有两个特点
默认情况下插入数据的时候会自动按key排序
key不能重复,重复插入无效
map和multimap唯一的区别就在于2,multimap可以插入key相同的数据,用一个例子解释
#include "stdafxh"
#include <map>
using namespace std;
void showmap(map<int,char> mp)
{
printf("\n");
for(map<int,char>::iterator iter=mpbegin();iter!=mpend();++iter)
{
printf("%d-%c\n",iter->first,iter->second);
}
printf("\n");
}
void showmultimap(multimap<int,char> mmp)
{
printf("\n");
for(multimap<int,char>::iterator iter=mmpbegin();iter!=mmpend();++iter)
{
printf("%d-%c\n",iter->first,iter->second);
}
printf("\n");
}
int _tmain(int argc, _TCHAR argv[])
{
map<int,char> mp;
mpinsert(make_pair<int,char>(0,48));
mpinsert(make_pair<int,char>(1,49));
mpinsert(make_pair<int,char>(2,50));
mpinsert(make_pair<int,char>(3,51));
mpinsert(make_pair<int,char>(1,52));
showmap(mp);
multimap<int,char> mmp;
mmpinsert(make_pair<int,char>(0,48));
mmpinsert(make_pair<int,char>(1,49));
mmpinsert(make_pair<int,char>(2,50));
mmpinsert(make_pair<int,char>(3,51));
mmpinsert(make_pair<int,char>(1,52));
showmultimap(mmp);
getchar();
return 0;
}
运行结果:
0-0
1-1
2-2
3-3
0-0
1-1
1-4
2-2
3-3
对于map,key是唯一的,如果已经存在key了,再次插入想同key无效
multimap的key可以有多个
一元谓词: 函数参数1个,函数返回值是bool类型,可以作为一个判断式
二元谓词: 函数参数2个,函数返回值是bool类型
谓词可以使一个仿函数,也可以是一个回调函数。
一元谓词案例
求0到500整数哪些数被19整除
#include <iostream>
using namespace std;
#include <queue>
#include<vector>
template <typename T>
class Isdiv
{
public:
Isdiv(const T &divisor) //
{
this->divisor = divisor;
}
bool operator()(T &t) //1元谓词 例子
{
return (t%divisor == 0);
}
protected:
private:
T divisor;
};
void main()
{
vector<int> v2;
for (int i = 1; i<500; i++)
{
v2push_back(i);
}
vector<int>::iterator it;
int a = 4;
Isdiv<int> mydiv(4);
// _InIt find_if(_InIt _First, _InIt _Last, _Pr _Pred) //返回的是迭代器
int cn = 0;
it = find_if(v2begin(), v2end(), Isdiv<int> (19));
while(it != v2end())
{
cn++;
cout << "第"<<cn<<"个被4整除的数是:" << it << endl;
it = find_if(it+1, v2end(), Isdiv<int>(19));
}
cout << "一共有" << cn << "个数被19整除" << endl;
system("pause");
}
二元谓词
//1个key值可以对应多个valude(分组)
//公司有销售部 sale (员工2名)、技术研发部 development (1人)、财务部 Financial (2人)
//人员信息有:姓名,年龄,电话、工资等组成
//通过 multimap进行 信息的插入、保存、显示
//分部门显示员工信息
#include <iostream>
#include <string>
#include <map>
using namespace std;
class Person
{
public:
Person(string name,int age)
{
m_name = name;
m_age = age;
}
string m_name;
int m_age;
protected:
private:
};
int main(void)
{
Person p1("张三",32),p2("李四",33),p3("王二",34),p4("麻子",35),p5("赵五",36);
multimap<string, Person> map;
mapinsert(make_pair("Sale", p1));
mapinsert(make_pair("Sale", p2));
mapinsert(make_pair("Development", p3));
mapinsert(make_pair("Development", p4));
mapinsert(make_pair("Financial", p5));
for (multimap<string, Person>::iterator it = mapbegin(); it != mapend();it++)
{
cout << it->first << "\t" << (it->second)m_name <<endl;
}
int num = mapcount("Development");
cout << "开发部的人数:" << num << endl;
cout << "开发部的员工信息:" << endl;
multimap<string, Person>::iterator new_it = mapbegin();
while (new_it != mapend() )
{
if (new_it->first == "Development")
{
new_it->secondm_age = 18;
cout << new_it->first << "\t" << (new_it->second)m_name << "\t" << (new_it->second)m_age << endl;
}
new_it++;
}
cout<<"Hello!"<<endl;
system("pause");
return 0;
}
#include <iostream>
using namespace std;
#include <queue>
#include<vector>
#include<set>
struct CompareNoCase
{
bool operator()(const string &str1, const string &str2) const
//在调用operator()的时候要求operator()也具有const属性,否则就会导致丢失const限定符的错误
{
string str1_;
str1_resize(str1size());
transform(str1begin(), str1end(), str1_begin(), tolower); //预定义函数对象
string str2_;
str2_resize(str2size());
transform(str2begin(), str2end(), str2_begin(), tolower); //预定义函数对象
return (str1_ < str2_); // 从小到大进行排序
}
};
void main()
{
set<string> set1;
set1insert("bbb");
set1insert("aaa");
set1insert("ccc");
set<string>::iterator it = set1find("aAa"); //find函数 默认 区分大小写
if (it == set1end())
{
cout << " 没有 查找到 aaa " << endl;
}
else
{
cout << " 查找到 aaa " << endl;
}
set<string, CompareNoCase> set2;
set2insert("bbb");
set2insert("aaa");
set2insert("ccc");
set<string, CompareNoCase>::iterator it2 = set2find("aAa");
if (it2 == set2end())
{
cout << " 没有 查找到 aaa " << endl;
}
else
{
cout << " 不区分大小的的查找 查找到 aaa " << endl;
}
system("pause");
}
免费C/C++基础丶进阶资料,还有实践课程免费领,加群728483370
以上就是关于c++multimap自定义key值时,需要重载什么东西啊全部的内容,包括:c++multimap自定义key值时,需要重载什么东西啊、C/C++ VC++ map的模版有key和value 现有一张ini的文件 存放的形式 是section下的多个key分别对应value、c++ 输出map每个元素的值等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)