C++ 映射的Setter和Getter方法

C++ 映射的Setter和Getter方法,c++,stl,C++,Stl,同样,如何为这样的映射编写setter和getter方法 std::map varmap 您可以像编写任何其他字段一样,为std::map字段编写一个getter或setter,只需让getter返回一个std::map,并让setter接受一个std::map 当然,如果您有一个字段是std::map,您正试图在其上使用getter和setter,这可能表明有更好的方法来构造程序。你能提供更多关于你想做什么的细节吗 编辑:上述答案针对的问题与您提出的问题略有不同。看来你感兴趣的是 给定一个具有

同样,如何为这样的映射编写setter和getter方法


std::map varmap

您可以像编写任何其他字段一样,为
std::map
字段编写一个getter或setter,只需让getter返回一个
std::map
,并让setter接受一个
std::map

当然,如果您有一个字段是
std::map
,您正试图在其上使用getter和setter,这可能表明有更好的方法来构造程序。你能提供更多关于你想做什么的细节吗

编辑:上述答案针对的问题与您提出的问题略有不同。看来你感兴趣的是

给定一个具有
std::map
作为数据成员的类,编写一个函数来设置给定的键/值对,并编写一个函数来返回与给定键关联的值

实现这一点的setter逻辑并不难——您只需编写一个函数,该函数接受键和值,并将键与值关联起来。例如:

string var;

void setvar(string ivar)
{
    var=ivar;
}

string getVar() const
{
    return var;
}
编写getter更为棘手,因为无法保证存在与特定键关联的值。发生这种情况时,您有多种选择

  • 您可以返回一个sentinel值。例如,如果给定的值未存储在映射的任何位置,则可能返回空字符串。这使得使用函数的代码更易于阅读,但有可能在代码中使用无效值
  • 您可以抛出异常。如果给定值不存在,则表示严重错误,则最好抛出异常。这样做的缺点是,如果查找一个值,则始终需要
    尝试
    /
    捕获逻辑以避免错误传播
  • 您可以将一个默认值与该键关联,然后将其返回。例如,如果您正在编写一个表示音乐库的程序,例如,如果您试图查找艺术家的歌曲,但没有数据,则可以返回“(无)”或“(未知)”

  • 这些方法中没有一种效果最好,您需要考虑哪一种最适合您的特定情况。

    您是要在现有映射中设置键值对(可能这就是您想要的)还是创建新映射本身

    void put(const string& key, const string& value) {
        varmap[key] = value;
    }
    
    其中int和string可以互换


    对于后者,您可能需要对所有映射值进行交互以进行设置,getter应该只返回该映射指针。
    std::map
    中的条目必须有一个键和一个值。获取和设置它们的正常方式是:

    void setvar(string key, int value)
    {
        myMap[key] = value;
    }
    
    int getVar(string key) const
    {
        return myMap[key];
    }
    
    如果您想添加新功能,它们可能与您建议的不一样,因为:

    • 您的
      集合
      只提供了一个参数,尽管需要一个键和值(诚然,您可以采用一些约定,比如将第一个“:”或“=”分隔开),并且
    • get()函数不提供任何键
    您可以选择更像:

    my_map[a_key] = new_value;   // set
    
    do_something_with(my_map[a_key]);    // get and use...
    

    但是,即使您有这样的写权限,也不应该在MAP头文件中直接添加它——在该计算机上编译的所有C++程序将共享该文件,并且不会期望修改它。任何小的错误都会引起麻烦,如果你把程序传送到另一台计算机,你将无法在那里编译它而不进行类似的修改——如果该计算机使用不同的C++编译器,修改的必要细节也可能略有不同。 因此,您可以编写自己的(最好是模板化的)类,该类派生自(继承)或包含(组合)std::map,在自定义类中提供函数。基于继承的解决方案更容易编写,也更简洁:

    void set(const Key&, const Value&);
    std::string get(const Key&) const;
    
    模板
    结构我的映射:std::Map
    {
    My_Map(…);//必须提供所需的任何非默认构造函数。。。
    无效集(常量键和键,常量值和值){运算符[](键)=值;}
    //如果希望使用默认值创建不存在的键的条目。。。
    Value&get(const-Key&Key){返回操作符[](Key);}
    ---或---
    //如果要为不存在的键引发异常。。。
    Value&get(const Key&Key){return at(Key);}
    const Value&get(const Key&Key)const{return at(Key);}
    };
    
    如果您计划通过指针传递My_Maps,但意外地得到一个“new My_Map”指针,而该指针后来被作为std::Map指针删除,则这有点危险,如中所示:

    template <typename Key, typename Value>
    struct My_Map : std::map<Key, Value>
    {
        My_Map(...); // have to provide any non-default constructors you want...
    
        void set(const Key& key, const Value& value) { operator[](key) = value; }
    
        // if you want entries for non-existent keys to be created with a default Value...
        Value& get(const Key& key) { return operator[](key); }
    
        --- OR ---
    
        // if you want an exception thrown for non-existent keys...
        Value& get(const Key& key) { return at(key); }
        const Value& get(const Key& key) const { return at(key); }
    };
    
    void f(std::map*p){/*use*p*/delete p;}
    My_Map*p=新建My_Map;
    f(p);
    
    尽管如此,在大多数程序中,意外地处理这样一张地图并没有真正的危险,所以继续做吧

    此外,这种想法会使我不受周围标准恐惧纯粹主义者的欢迎-因为
    My_Map
    没有添加任何数据成员或其他基础,
    std::Map
    析构函数可能会进行所有必要的分解,即使它在技术上是未定义的行为。我是“强>不<强”,鼓励你忽略这个问题(在一个需要稳健性的工作中,它会被认为是不专业的),但是你至少可以稍微轻松一点。我很想听到任何编译器/设置明显不能安全运行的人的声音


    如果您使用composition,您必须编写自己的“转发”函数,以便像std::Map一样使用My_映射,访问迭代器、查找、擦除、插入等。。这很痛苦。

    Setter和getter for
    std::map
    没有什么不同,只是需要为Setter传递必要的参数。假设我有一个
    struct
    并且有一个类型为
    std::map
    的成员变量,其
    key
    的类型为
    char
    ,而
    data
    的类型为
    int
    。方法签名的格式为-

    • 
      
      void f(std::map<int, string>* p) { /* use *p */   delete p; }
      
      My_Map<int, string>* p = new My_Map<int, string>;
      f(p);
      
      struct myMap
      {
          std::map<char, int> encode;
          void setEncode( char* key, int* data, const int& size );
          std::map<char, int> getEncode() const ;
      };
      
      void myMap::setEncode( char *key, int* data, const int& size )
      {
          int i=0;
          while( i < size )
          {
                  encode.insert(std::pair<char, int>(key[i], data[i]));
                  ++i ;           
          }
      }
      
      std::map<char, int> myMap::getEncode() const
      {
          return encode;
      }