识字的编码比。的std ::对,解决方法?
-
22-07-2019 - |
题
由于大多数程序员我很佩服,并努力遵循识字编程的原则,但在C ++中我经常使用std::pair
,对于一个极大常见任务发现自己。但是std::pair
是,恕我直言,有文化节目的一个卑鄙的敌人......
我的观点是,当我回来的代码,我已经写了一个或两个天前,我看到一个std::pair
(通常作为一个迭代器)的操作我不知道我自己“的干了什么iter->第一和iter->第二平均??? ”。
我猜看着他们std::pair
代码,当别人有同样的疑惑,所以我想知道,有没有人想出一些好的解决方案使用std::pair
时恢复识字?
解决方案
这样如何:
struct MyPair : public std::pair < int, std::string >
{
const int& keyInt() { return first; }
void keyInt( const int& keyInt ) { first = keyInt; }
const std::string& valueString() { return second; }
void valueString( const std::string& valueString ) { second = valueString; }
};
这是一个有点冗长,但使用这个在你的代码可能会使事情变得更容易阅读,例如:
std::vector < MyPair > listPairs;
std::vector < MyPair >::iterator iterPair( listPairs.begin() );
if ( iterPair->keyInt() == 123 )
iterPair->valueString( "hello" );
除此之外,我看不到那将让事情更加清楚任何灵丹妙药。
其他提示
std::pair
是做一个“本地”和基本上匿名类型具有基本匿名列的好方法;如果您使用的是某对在如此大的一个词法空间,你需要命名的类型和专栏中,我会使用一个普通的struct
代替。
typedef std::pair<bool, int> IsPresent_Value;
typedef std::pair<double, int> Price_Quantity;
...你明白了吧。
可以创建2对吸气剂(常数和非),将仅仅返回到第一和第二参考,但将变得更具有可读性。例如:
string& GetField(pair& p) { return p.first; }
int& GetValue(pair& p) { return p.second; }
会让你从一对给定的字段和值的成员,而不必记住哪个成员拥有什么。
如果您希望使用这个有很多,您还可以创建给出的名称和类型,一个宏会为你生成这些干将:MAKE_PAIR_GETTERS(场,字符串值,INT)左右。使干将直白可能会允许编译器优化他们走,所以他们会在运行时添加任何开销;并使用宏将使它能够轻松地创建为你做对任何使用这些干将。
最近我发现使用boost::tuple
作为std::pair
替代自己。您可以定义枚举的每个成员,因此很明显每个成员是什么:
typedef boost::tuple<int, int> KeyValueTuple;
enum {
KEY
, VALUE
};
void foo (KeyValueTuple & p) {
p.get<KEY> () = 0;
p.get<VALUE> () = 0;
}
void bar (int key, int value)
{
foo (boost:tie (key, value));
}
顺便说一句,评论欢迎如果有一个隐藏的成本来使用此方法。
修改:从全球范围中删除名字强>
。就有关全局命名空间的快速评论。一般来说,我使用:
struct KeyValueTraits
{
typedef boost::tuple<int, int> Type;
enum {
KEY
, VALUE
};
};
void foo (KeyValueTuple::Type & p) {
p.get<KeyValueTuple::KEY> () = 0;
p.get<KeyValueTuple::VALUE> () = 0;
}
它看起来是该boost::fusion
确实扎身份和值更靠近在一起的情况。
亚历克斯提到,std::pair
很方便,但是当它被混淆创建一个结构,以同样的方式使用它,看看std::pair
代码,它并不复杂。
我不喜欢的std ::对作为在标准::地图使用,也可以,映射条目应该有构件的键和值。结果 我甚至用的boost :: MIC避免这种情况。然而,提振:: MIC还配备了成本。
另外,在小于可读代码返回一个std ::对结果:
if (cntnr.insert(newEntry).second) { ... }
???
我还发现,性病::对通常是通过谁需要2个值,但没想到懒惰的程序员使用,为什么在需要的地方在一起的这些值。