C++ 映射的Setter和Getter方法
同样,如何为这样的映射编写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,这可能表明有更好的方法来构造程序。你能提供更多关于你想做什么的细节吗 编辑:上述答案针对的问题与您提出的问题略有不同。看来你感兴趣的是 给定一个具有
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更为棘手,因为无法保证存在与特定键关联的值。发生这种情况时,您有多种选择
尝试/捕获逻辑以避免错误传播
这些方法中没有一种效果最好,您需要考虑哪一种最适合您的特定情况。您是要在现有映射中设置键值对(可能这就是您想要的)还是创建新映射本身
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; }