我该如何编写一对列表

how can I write a list of pair?

本文关键字:列表 何编写      更新时间:2023-10-16

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

#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>'

您可以帮助我检测到问题到底在哪里?

您传递给 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;
}

您的问题是,您的printStars()期望list,但是for_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;
}