1

我正在尝试返回std::pair具有intstring值的内容。我应该保留什么函数的返回类型?

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

#include<iostream>
#include<algorithm>
#include<map>
#include<vector>

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

std::vector<std::string> most { "lion","tiger","kangaroo",
                                 "donkey","lion","tiger",
                                 "lion","donkey","tiger"
                                 };
std::map<std::string, int> src;
for(auto x:most)
    ++src[x];

std::multimap<int,std::string,std::greater<int> > dst;

std::transform(src.begin(), src.end(), std::inserter(dst, dst.begin()), 
                   [] (const std::pair<std::string,int> &p) {
                   return std::pair<int,std::string>(p.second, p.first);
                   }
                 );

std::multimap<int,std::string>::iterator it = dst.begin();

 for(int count = 0;count<3 && it !=dst.end();++it,++count)
   std::cout<<it->second<<":"<<it->first<<std::endl;

 return *it;  
}

int main()
{
std::multimap<int,std::string>::const_iterator rec;
rec= client();  // Error  no match for ‘operator=’ in ‘rec = client()()’
std::multimap<int,std::string>::iterator it = rec.begin();  //error: ‘std::multimap<int, std::basic_string<char> >::const_iterator’ has no member named ‘begin’

 for(int count = 0;count<3 && rec !=it.end();++it,++count) // error: has no member named 'end' 
   std::cout<<rec->second<<":"<<rec->first<<std::endl;

}
4

3 回答 3

7

只需将int&std::string本身作为multimap包含作为其元素的对返回

std::pair<int,std::string> client(){
//...  
}
于 2013-09-01T14:39:44.827 回答
1

如果您想返回映射条目(即键和值),则只需使用std::pair<int, std::string>作为返回类型,如其他答案所述。

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

于 2013-09-01T14:40:52.763 回答
1

如果您想从 a 返回 a 值,std::map我不会明确使用std::pair(尽管这样做非常好)。就我个人而言,我会使用std::map::value_typewhich 表示存储在映射中的值的类型(注意:所有容器都有一个名为 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)。

于 2013-09-01T16:59:40.850 回答