地图的Setter和Getter方法

时间:2011-03-02 06:55:56

标签: c++ stl

string var;

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

string getVar() const
{
    return var;
}

同样如何为这样的地图编写setter和getter方法

std :: map varmap;

4 个答案:

答案 0 :(得分:2)

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

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

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

  

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

这个的setter逻辑并不太难 - 你只需编写一个接受键和值的函数,并将键与值相关联。例如:

void put(const string& key, const string& value) {
    varmap[key] = value;
}

编写一个getter是比较棘手的,因为不能保证有一个与特定键相关的值。发生这种情况时,您有多种选择。

  1. 您可以返回哨兵值。例如,如果给定值未在地图中存储在任何位置,则可能返回空字符串。这使得使用函数的代码更容易阅读,但在代码中使用无效值的风险。
  2. 您可以抛出异常。如果它表示给定值不存在的严重错误,那将会很好。这样做有一个缺点,即如果你查找一个值,你总是需要try / catch逻辑来避免传播错误。
  3. 您可以将默认值与键相关联,然后再将其关联。例如,如果您正在编写代表音乐库的程序,则可以将“(无)”或者“(未知)”,如果你试图查找艺术家的一首没有数据的歌曲,例如。
  4. 这些方法中没有一种效果最好,您需要考虑哪种方法最适合您的特定环境。

答案 1 :(得分:1)

std::map<Key, Value>中的条目必须包含密钥和值。获取和设置它们的正常方法是:

my_map[a_key] = new_value;   // set

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

如果你想添加新功能,它们可能看起来不像你提出的那样,因为:

  • 你的set只有一个参数,尽管需要一个键和值(诚然,你可以采用一些惯例,例如让第一个':'或'='分开它们),
  • get()函数不提供任何密钥。

你可以改为更喜欢:

void set(const Key&, const Value&);
std::string get(const Key&) const;

但是,即使您具有写入权限,也不应该直接在映射头文件中添加 - 在该计算机上编译的所有C ++程序都将共享该文件,并且不会期望它被修改。任何小错误都可能导致麻烦,如果您将程序运送到另一台计算机,则无法在不进行类似修改的情况下编译它 - 如果该计算机使用不同的C ++编译器,则该修改的必要细节可能略有不同太

因此,您可以编写自己的(最好是模板化的)类,该类派生自(继承)或包含(组合)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); }
};

如果您计划通过指针传递My_Maps并且意外地以“new My_Map”指针结束,稍后将其作为std :: map指针删除,则这有点危险,如:

void f(std::map<int, string>* p) { /* use *p */   delete p; }

My_Map<int, string>* p = new My_Map<int, string>;
f(p);

但是,在大多数程序中,没有意外处理这样的地图的真正危险,所以继续这样做。

此外,这种想法会让我不喜欢这里的标准恐惧纯粹主义者 - 因为My_Map没有添加任何数据成员或其他基础std::map<>析构函数可能进行所有必要的拆除,即使它是技术上未定义的行为。我鼓励你忽略这个问题(并且会认为它在需要健壮性的工作中不专业),但你至少可以稍微休息一下。我很想知道任何人的任何编译器/设置,但它确实无法安全运行。

如果你使用合成,你必须编写自己的“转发”函数,让你像使用std :: map一样使用My_Map,访问迭代器,查找,擦除,插入等等。这很痛苦。

答案 2 :(得分:0)

std::map的setter和getter没有什么不同,除了你需要为setter传递必要的参数。假设我有一个struct并且有一个类型为std::map的成员变量,其key类型为chardata的类型为{{1} }}。方法签名的格式为 -

  • int因为,std :: map需要传递密钥,数据和大小。在不知道void setEncode( char* key, int* data, const int& size );的情况下,将元素插入容器的距离是未知的。
  • size const关键字表示它是非修改成员函数。因为它的功能是只返回std::map<char, int> getEncode() const ;类型的变量。

示例 -

std::map

Results IdeOne。这应该给你一个想法,但也应该遵循@templatetypedef,@tony建议的一般规则。

答案 3 :(得分:-1)

您想在现有地图中设置一个键值对(可能就是您想要的)或创建一个新地图吗?

void setvar(string key, int value)
{
    myMap[key] = value;
}

int getVar(string key) const
{
    return myMap[key];
}

其中int和string是可互换的

对于后者,您可能需要对所有地图值进行交互以进行设置,而getter应该只是返回该地图指针。