string var;
void setvar(string ivar)
{
var=ivar;
}
string getVar() const
{
return var;
}
同样如何为这样的地图编写setter和getter方法
std :: map varmap;
答案 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是比较棘手的,因为不能保证有一个与特定键相关的值。发生这种情况时,您有多种选择。
try
/ catch
逻辑来避免传播错误。这些方法中没有一种效果最好,您需要考虑哪种方法最适合您的特定环境。
答案 1 :(得分:1)
std::map<Key, Value>
中的条目必须包含密钥和值。获取和设置它们的正常方法是:
my_map[a_key] = new_value; // set
do_something_with(my_map[a_key]); // get and use...
如果你想添加新功能,它们可能看起来不像你提出的那样,因为:
set
只有一个参数,尽管需要一个键和值(诚然,你可以采用一些惯例,例如让第一个':'或'='分开它们),你可以改为更喜欢:
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
类型为char
而data
的类型为{{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应该只是返回该地图指针。