【问题标题】:How to use each value of a std::set as a key of a map如何使用 std::set 的每个值作为映射的键
【发布时间】:2017-08-19 08:53:04
【问题描述】:

假设我们有一张带有int 和一组strings 的地图

std::map < int , std::set<std::string> >  myString;

1=> "set1"
1=> "set2"
2=> "set1"
2=> "set2"

现在,是否可以将上述集合的每个唯一值设为映射键
粗略地说,数据就像

1=>
  set1=> "Hello"
  set1=> "Hey"
  set1=> "Wow"
1=>  
  set2=> "Hello"
  set2=> "Hey"
  set2=> "Wow"
2=>

  set1=> "Hello"
  set1=> "Hey"
  set1=> "Wow"
2=>  
  set2=> "Hello"
  set2=> "Hey"
  set2=> "Wow"

简单来说,我正在尝试设计一个映射,它有一个指向字符串集的整数键,并且每个字符串又有多个值,因此我认为一组字符串作为一个纯字符串到整数会覆盖这些值我们将只有一个最终值。

我认为下面的语法不能解决问题:

std::map < std::set<std::string>, std::string >  myString;

您的建议将非常有帮助,因为我正在尝试将更大的问题分解为简短的内容,并将加入所有这些子问题。

对不起,如果我的解释不好且令人困惑。 这是我尝试过的代码

#include <map>
#include <iostream>
#include <string>
#include <vector>
#include <set>

struct values
{
    std::string a;
    std::string b;
    values():a("milepost"),b("dummyval"){};
    values( std::string ab, std::string bc)
    {
        a=ab;
        b=bc;

    };
    bool operator<(const values& other) const { return a< other.a;}

};

int main(int argc, const char * argv[]) {

    //Create set of types firstly
    std::set<std::string> types ;
    types.insert("et");
    types.insert("pt");

    typedef std::map< int,std::set<std::string> > myGroupsMap;
    typedef std::map<std::string,values>  myWsData;
    typedef std::map< std::string , std::set<myWsData> > myFinalData;
    typedef std::map< int,std::set<myFinalData> > myGroupData;


    //Create the group  with all types in each of them
   // groupname  type
   //    1        et
   //    2        et
   //    1        pt
   //    2        pt

    myGroupsMap groupTypeMap;

    groupTypeMap.insert(std::make_pair(1, types) );


 groupTypeMap.insert(std::make_pair(2, types) );
    groupTypeMap.insert(std::make_pair(3, types) );
    groupTypeMap.insert(std::make_pair(4, types) );
    groupTypeMap.insert(std::make_pair(5, types) );

    //Create the object of structure
    values a,b,c;

    //Create map and insert the string and its corresponding structure
    myWsData et_Data1,pt_Data2;
    et_Data1.insert(std::make_pair("780256", a));
et_Data1.insert(std::make_pair("780255", b));
et_Data1.insert(std::make_pair("780254", c));

pt_Data2.insert(std::make_pair("780256", a));
pt_Data2.insert(std::make_pair("780255", b));
pt_Data2.insert(std::make_pair("780254", c));

std::set<myWsData> myet_pt_data;
myet_pt_data.insert(et_Data1);
myet_pt_data.insert(pt_Data2);



  myFinalData fd , fd1 , fd2 ;
    fd.insert(std::make_pair ("ET",myet_pt_data) );
    fd.insert(std::make_pair ("PT",myet_pt_data) );

    fd1.insert(std::make_pair ("ET",myet_pt_data) );
    fd1.insert(std::make_pair ("PT",myet_pt_data) );

    fd2.insert(std::make_pair ("ET",myet_pt_data) );
    fd2.insert(std::make_pair ("PT",myet_pt_data) );


    std::set<myFinalData> mfd;
    mfd.insert(fd);
    mfd.insert(fd1);
    mfd.insert(fd2);


    myGroupData mygd;
    mygd.insert(std::make_pair (1,mfd) );
    mygd.insert(std::make_pair (2,mfd) );
    mygd.insert(std::make_pair (3,mfd) );


    return 0;

 }

谢谢。 光辉

【问题讨论】:

  • 地图中不能有两个具有相同键的元素,例如 "1=> "set1",1=> "set2",2=> "set1",2=> "set2 "" 不是地图
  • 根据 example ,可以使用 map 和 key 1 可以同时具有值​​ set1 和 set2 。我的问题是让这个值集的每个值都充当映射键 std::map>
  • 每个键肯定可以有很多元素,诀窍是 std::set
  • 您的问题根本不清楚,但这是在黑暗中刺伤。也许您想要的是 2 张单独的地图。 1) map&lt;int, set&lt;string&gt;&gt; 和 2) map&lt;string, SomeStruct&gt; -- 其中包含在第一个映射集合中的字符串用作第二个映射的键。这有意义吗?它是否可能适用于您要解决的问题?老实说,我不知道是不是这样,因为就像我说的,你的问题很不清楚。
  • 这看起来是个 XY 问题。您能描述一下您要解决的真正问题吗?

标签: c++ string c++11 stdmap


【解决方案1】:

映射有一个整数键指向一组字符串,并且每个字符串又有多个值

如果我只是从字面上理解并假设“多个值”是指一些自定义类型,那么我可能会想出这样的东西:

#include <map>
#include <set>
#include <vector>
#include <string>

struct Foo{
        int _id;
        Foo(int id):_id(id){}
        bool operator<(const Foo& other) const { return _id < other._id;}
};

typedef std::vector<Foo>                      multiple_values;
typedef std::string                           each_string;
typedef std::map<each_string,multiple_values> again_has;
typedef std::set<again_has>                   set_of_strings_and;
typedef std::map<int,set_of_strings_and>      map_which_has;

int main(){
    multiple_values    mv   = {Foo(1),Foo(2)};
    again_has          ah   = {{"test",mv}};
    set_of_strings_and sosa = {ah};
    map_which_has      mwh  = {{0,sosa}};
};

【讨论】:

  • 请查看我所做的代码更新。它不会在 mac 中编译,也不会显示任何错误。我想我必须更新我的 Xcode
  • 很抱歉,我在突破这个问题时迷失了方向,现在对我的代码更加困惑 :),感谢您的支持
  • 你能解释一下为什么你重载了运算符
  • 根据你的代码,我的要求是 0=>sosa=>"test0"=>structure , 1=>sosa=>"test1"=>structure , 1=>sasa=> "test2"=>structure , 2=>sosa=>"test3"=>structure 为 {} 道歉,这实际上是新手,但显然 1 有 2 个值(sosa 和 sasa)
  • @LearningCpp 不是 100% atm,但我认为是 set 需要 operator&lt; 来检查两个元素是否相等
猜你喜欢
  • 1970-01-01
  • 2015-04-22
  • 2018-02-22
  • 1970-01-01
  • 1970-01-01
  • 2020-02-03
  • 1970-01-01
  • 2015-10-11
  • 2015-08-12
相关资源
最近更新 更多