由于大多数程序员我很佩服,并努力遵循识字编程的原则,但在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个值,但没想到懒惰的程序员使用,为什么在需要的地方在一起的这些值。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top