1

および値std::pairを持つコンテンツを返そうとしています。関数のどの戻り型を保持する必要がありますか?intstring

int両方とchar戻り値の型を試しましたが、両方でエラーが発生します。以下のエラーを出しました:

#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>他の回答が述べたように、戻り値の型として使用してください。

キーを返すだけの場合は、return it->first(およびint戻り値の型として使用) します。値だけを返したい場合は、return it->second(および戻り値std::stringの型として使用) します。

于 2013-09-01T14:40:52.763 に答える
1

a から a 値を返したい場合は、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. 次に、変更する必要があるのは 1 つだけです (単一の typedef)。戻る場合std::pair<int,std::string>は、2 つの場所 (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。2 番目の例 (typedef を使用) では、(MapForX で) 1 つの変更のみを行う必要があります。上記の例では、2 つの変更を行う必要があります (1 つは MapForX 用、もう 1 つは戻り値の型の std::pair です)。

于 2013-09-01T16:59:40.850 に答える