如何返回std :: pair的内容?

时间:2013-09-01 14:38:07

标签: c++ return return-value

我正在尝试返回std::pair的{​​{1}}和int值的内容。 我应该保留什么功能返回类型?

我尝试使用stringint返回类型,但两者都给出了错误。我在下面给出了错误:

char

3 个答案:

答案 0 :(得分:7)

只需退回int& std::string本身 因为multimap包含它作为其元素

std::pair<int,std::string> client(){
//...  
}

答案 1 :(得分:1)

如果你想返回地图条目(即键和值),那么只需使用std::pair<int, std::string>作为返回类型,就像提到的其他答案一样。

如果您只想返回密钥,请返回it->first(并使用int作为返回类型)。如果您只想返回值,请返回it->second(并使用std::string作为返回类型)。

答案 2 :(得分:1)

如果你想从std::map返回一个值,我不会明确地使用std::pair(尽管这样做完全没问题)。我个人会使用std::map::value_type来表示存储在地图中的值的类型(注意:所有容器都有一个名为value_type的类型成员,表示存储的类型。)

std::multimap<int,std::string>::value_type client()
{
     // STUFF
     std::multimap<int,std::string>::iterator it = dst.begin();

     // STUFF;
     return *it;   // Note: this is UB if it == dst.end()
}

我使用value_type而不是std::pair的原因通常是我不会使用显式类型,但会创建typedef(所以它看起来像这样)。

typedef std::multimap<int,std::string>  MapForX; // Modification to map here
                                                 // Will automatically roll threw all
                                                 // the following code as everything
                                                 // is defined in terms of `MapForX`

MapForX::value_type client()
{
     // STUFF
     MapForX::iterator it = dst.begin();

     // STUFF;
     return *it;   // Note: this is UB if it == dst.end()
}

现在,如果我更改MapForX的类型。然后我只需要改变一件事(单一的typedef)。如果返回std::pair<int,std::string>,则必须在两个位置进行更改(typedef和返回值)。对我来说,多余的变化可能会导致问题。

作为演示:如果您返回std::pair<int, std::string>,则代码如下所示:

typedef std::multimap<int,std::string>  MapForX; // Modification to map here
                                                 // Will automatically roll threw MOST
                                                 // the following code.

// But notice this return type is not defined in terms of MapForX
// Thus if you change MapForX you will also need to change the return type.
// to match the correct type.
std::pair<int, std::string> client()
{
     // STUFF
     MapForX::iterator it = dst.begin();

     // STUFF;
     return *it;   // Note: this is UB if it == dst.end()
}

这非常有效。但是在未来你必须做出一些改变。而且你也改变了地图的类型int => MySpecialType。现在在我的第二个例子中(使用typedef)你只需要进行一次更改(在MapForX中)。在上面的示例中,您需要进行两处更改(一种用于MapForX,一种用于返回类型的std :: pair)。