c++multimap自定义key值时,需要重载什么东西啊

c++multimap自定义key值时,需要重载什么东西啊,第1张

应该是小于 *** 作符 <

因为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每个元素的值等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9331297.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存