我正在尝试返回std::pair
的{{1}}和int
值的内容。
我应该保留什么功能返回类型?
我尝试使用string
和int
返回类型,但两者都给出了错误。我在下面给出了错误:
char
答案 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)。