我怎么写一对配对列表?

时间:2014-01-23 23:54:28

标签: c++ list std-pair

我目前正在尝试编写一对配对列表。我的代码是:

#include <iostream>
#include <string>
#include <algorithm>
#include <iterator>
#include <list>
using namespace std;

list<pair<string,char>> listPair;
list<pair<string,char>>::iterator it;
void printStars(list<pair<string,char>> listPair)
{

  for (it=listPair.begin(); it != listPair.end(); it++)
    cout << it->first <<" ";
  cout << endl;
}
int main()
{
    pair<string,char> mypair;
    listPair.push_back(make_pair("bib",'a'));
    listPair.push_back(make_pair("bob",'b'));
    for_each(listPair.begin(), listPair.end(), printStars);
    return 0;
}

编译失败:

error C2664: 'void (std::list<_Ty>)' : cannot convert parameter 1 from 'std::pair<_Ty1,_Ty2>' to 'std::list<_Ty>'

你能帮我查一下确切的问题吗?

2 个答案:

答案 0 :(得分:2)

您传递给std::for_each的仿函数应该接受您传递到std::for_each的范围的元素。您的上一个元素包含pair<string,char>元素,因此您的仿函数应该具有以下签名:void printStars(const pair<string,char>& elem)

此外,要将普通函数传递给std::for_each,您需要使用std::ref或(在旧编译器上)std::ptr_fun

#include <iostream>
#include <algorithm>
#include <list>
#include <string> // missing include
#include <utility>
#include <functional>

using namespace std;

typedef list< pair<string,char> > list_t;
list_t listPair;
void printStars(list_t::reference x) // use a reference, otherwise you create a copy
{
  cout << x.first << " " << x.second << endl;
}
int main()
{
    pair<string,char> mypair;
    listPair.push_back(make_pair("bib",'a'));
    listPair.push_back(make_pair("bob",'b'));
    for_each(listPair.begin(), listPair.end(), std::ref(printStars)); // C++11
    for_each(listPair.begin(), listPair.end(), std::ptr_fun(&printStars)); // C++98

    return 0;
}

答案 1 :(得分:1)

您的问题是,printStars()期望listfor_each每个项目都会传递,而不是实际列表:

工作代码:

#include <iostream>
#include <algorithm>
#include <iterator>
#include <list>
#include <string>
#include <utility>

list<pair<string,char> > listPair;
list<pair<string,char> >::iterator it;
void printStars(const pair<string,char> & listPair){ //notice the &, so it would pass by reference and not make a new copy of the pair.
    cout << listPair.first << ' ';

}
int main() {
    pair<string,char> mypair;
    listPair.push_back(make_pair("bib",'a'));
    listPair.push_back(make_pair("bob",'b'));
    for_each(listPair.begin(), listPair.end(), printStars);
    cout << endl;
    return 0;
}