【问题标题】:How to iterate and find from map<pair<string, int>, pair<string, Array>>?如何从 map<pair<string, int>, pair<string, Array>> 中迭代和查找?
【发布时间】:2019-12-27 08:28:46
【问题描述】:

这是我的地图:

map<pair<string, int>, pair<string, Array> > matchMap;

这是函数:

void Schedule::studentSchedule() 
{
    string s, c;
    cout << "Enter the student and course name to create schedule" << endl;
    cin >> s >> c;

    list<string>::iterator studentLoc;
    map<pair<string, int>, pair<string, Array> >::iterator courseL;

    studentLoc = find(getStudentList().begin(), getStudentList().end(), s);
    courseL = find(getMatchMap().begin(), getMatchMap().end(), c);

    if (studentLoc != getStudentList().end() && courseL != getMatchMap().end())
    {}
}

我在此处找不到字符串,因为出现错误:

courseL = find(getMatchMap().begin(),getMatchMap().end(),c);

我怎样才能找到我想要的元素?这是错误:

In file included from C:/PROGRA~1/MINGW-~1/X86_64~1.0-P/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/stl_algobase.h:71,
                 from C:/PROGRA~1/MINGW-~1/X86_64~1.0-P/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/algorithm:61,
                 from C:\Users\Fatih\Desktop\clion\SchoolProject1\Schedule.cpp:4:
C:/PROGRA~1/MINGW-~1/X86_64~1.0-P/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/predefined_ops.h: In instantiation of 'bool __gnu_cxx::__ops::_Iter_equals_val<_Value>::operator()(_Iterator) [with _Iterator = std::_Rb_tree_iterator<std::pair<const std::pair<std::__cxx11::basic_string<char>, int>, std::pair<std::__cxx11::basic_string<char>, std::array<int, 6> > > >; _Value = const std::__cxx11::basic_string<char>]':
C:/PROGRA~1/MINGW-~1/X86_64~1.0-P/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/stl_algo.h:104:42:   required from '_InputIterator std::__find_if(_InputIterator, _InputIterator, _Predicate, std::input_iterator_tag) [with _InputIterator = std::_Rb_tree_iterator<std::pair<const std::pair<std::__cxx11::basic_string<char>, int>, std::pair<std::__cxx11::basic_string<char>, std::array<int, 6> > > >; _Predicate = __gnu_cxx::__ops::_Iter_equals_val<const std::__cxx11::basic_string<char> >]'
C:/PROGRA~1/MINGW-~1/X86_64~1.0-P/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/stl_algo.h:161:23:   required from '_Iterator std::__find_if(_Iterator, _Iterator, _Predicate) [with _Iterator = std::_Rb_tree_iterator<std::pair<const std::pair<std::__cxx11::basic_string<char>, int>, std::pair<std::__cxx11::basic_string<char>, std::array<int, 6> > > >; _Predicate = __gnu_cxx::__ops::_Iter_equals_val<const std::__cxx11::basic_string<char> >]'
C:/PROGRA~1/MINGW-~1/X86_64~1.0-P/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/stl_algo.h:3905:28:   required from '_IIter std::find(_IIter, _IIter, const _Tp&) [with _IIter = std::_Rb_tree_iterator<std::pair<const std::pair<std::__cxx11::basic_string<char>, int>, std::pair<std::__cxx11::basic_string<char>, std::array<int, 6> > > >; _Tp = std::__cxx11::basic_string<char>]'
C:\Users\Fatih\Desktop\clion\SchoolProject1\Schedule.cpp:24:63:   required from here
C:/PROGRA~1/MINGW-~1/X86_64~1.0-P/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/predefined_ops.h:241:17: error: no match for 'operator==' (operand types are 'std::pair<const std::pair<std::__cxx11::basic_string<char>, int>, std::pair<std::__cxx11::basic_string<char>, std::array<int, 6> > >' and 'const std::__cxx11::basic_string<char>')
  { return *__it == _M_value; }
           ~~~~~~^~~~~~~~~~~
In file included from C:/PROGRA~1/MINGW-~1/X86_64~1.0-P/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/stl_algobase.h:67,
                 from C:/PROGRA~1/MINGW-~1/X86_64~1.0-P/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/algorithm:61,
                 from C:\Users\Fatih\Desktop\clion\SchoolProject1\Schedule.cpp:4:
C:/PROGRA~1/MINGW-~1/X86_64~1.0-P/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/stl_iterator.h:860:5: note: candidate: 'template<class _IteratorL, class _IteratorR, class _Container> bool __gnu_cxx::operator==(const __gnu_cxx::__normal_iterator<_IteratorL, _Container>&, const __gnu_cxx::__normal_iterator<_IteratorR, _Container>&)'
     operator==(const __normal_iterator<_IteratorL, _Container>& __lhs,

【问题讨论】:

    标签: c++ algorithm c++11 data-structures stdmap


    【解决方案1】:

    你试过用find吗?

    courseL = matchMap.find(pair<string, int>{c, 1});
    

    您的地图的键是pair&lt;string, int&gt; 类型,因此要使用 find 您需要提供一个有效的键。

    【讨论】:

    • 我试过这样,但我又得到一个错误。查找错误没有匹配的成员函数
    • void Course::addCourse() { string a; int b; int total; int courseAdd; cout&lt;&lt;"How many course you want to add?"&lt;&lt;endl; cin&gt;&gt;courseAdd; cout&lt;&lt;"Enter the name of course and number of hours.\nWARNING:For now just enter max 6 course hours"&lt;&lt;endl; for(int i=0;i&lt;courseAdd;++i) { setCourseName(a); setHours(b); getCourseList().insert({a, b}); total += getHours(); shuffleVector(); getMatchMap().insert({make_pair(a,b),make_pair(getDay1()[i],dayHours)}); }
    【解决方案2】:

    总之,看到这个错误,

    no match for 'operator=='
    (operand types are 'std::pair<const std::pair<std::__cxx11::basic_string<char>, int>, 
    std::pair<std::__cxx11::basic_string<char>, std::array<int, 6> > >'
    and 'const std::__cxx11::basic_string<char>')
    

    您的地图的键(即getMatchMap())是std::pair&lt;std::string, int&gt;,而不仅仅是std::string,而且您只传递了std::string

    你需要

    std::find(getMatchMap().begin(), getMatchMap().end(), std::make_pair(s, /*some integer*/));
    //                                                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    

    或者更合适的是使用std::map::find 成员函数。

    const auto iter = getMatchMap().find(std::make_pair(s, /*some integer*/));
    

    【讨论】:

    • 但是我只需要在地图上找到课程名称。不是整数。
    • 据我了解,getMatchMap 函数导致的错误。我用 Dror Moyal 的答案更改了代码,它似乎有效。
    • 当我执行此解决方案时,我在运行代码时无法在地图上找到这些对。地图中的整数是用户定义的整数,我们实际上并不知道里面有什么。有没有办法在不发送整数的情况下找到课程名称?
    • courseL = find_if(getMatchMap().begin(),getMatchMap().end(),(courseL->first).first == c);我像这样更改了代码,但我又遇到了错误。
    • 错误:表达式不能用作函数 { return bool(_M_pred(*__it)); } ^~~~~~~~~~~~~~~~~~~~~~~
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-29
    • 1970-01-01
    相关资源
    最近更新 更多