在 binary_search 和 replace_if 上使用 Lambda

Using Lambda on binary_search and replace_if

我一直在努力让 binary_search 将 if 语句回答为真或假。我过去没有遇到过问题,但是我在搜索我组成的结构中的 tempStr 时遇到了问题。我试图用 binary_search 实现的是让它说出产品是否存在,并决定是否甚至费心做一个 for 循环或不实际出去获取产品的名称。执行时出错,不明白为什么。

我遇到的第二个问题是我想用用户输入的价格替换矢量中已有的价格,但这会导致与 binary_search 类似的错误。这是我在天真的尝试中所做的事情,我们将不胜感激任何和所有帮助。

如果有人要求我这样做,我会澄清。

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

struct grocery{
    string name;
    string expdate;
    string price;
};

int main(){
    grocery tempProd;
    string tempStr;
    vector<grocery> produce;
    
    cout << "What grocery product are you looking for?";
    getline(cin, tempStr);
    if(binary_search(produce.begin(), produce.end(), [&] (const grocery &p) {return p.name == tempStr;})){
        cout << "Product has been found!" << endl;
        for(int i= 0; i<produce.size(); i++){
            if(produce[i].name == tempStr){
                string tempStr2;
                cout << "What is going to be the new price of the product?";
                getline(cin, tempStr2);
                replace_if(produce.begin(), produce.end(), produce[i].price,
                    [&] (const grocery &p) {return p.price == tempStr2;});

            }
        }
        
    }
    else{
        cout << "Product does not exist." << endl;
    }
}

为此,我主要使用了 lambda,但它并没有给我带来多少成功。指针也似乎是我的答案,但这对我也没有多大好处,我似乎发现自己回到了这里,在这个位置。

这是结构的设置方式,以及向量的设置方式,因为我知道这两者都很重要。

错误

In file included from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\algorithm:62,
                 from teste.cpp:5:
c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\stl_algo.h: In instantiation of 'bool std::binary_search(_FIter, _FIter, const _Tp&) [with _FIter = __gnu_cxx::__normal_iterator<body*, std::vector<body> >; _Tp = main()::<lambda(const body&)>]':
teste.cpp:45:117:   required from here
c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\stl_algo.h:2259:39: error: no match for 'operator<' (operand types are 'const main()::<lambda(const body&)>' and 'body')
 2259 |       return __i != __last && !(__val < *__i);
      |                                ~~~~~~~^~~~~~~
In file included from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\stl_algobase.h:64,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\char_traits.h:39,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\ios:40,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\ostream:38,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\iostream:39,
                 from teste.cpp:1:
c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\stl_pair.h:454:5: note: candidate: 'template<class _T1, class _T2> constexpr bool std::operator<(const std::pair<_T1, _T2>&, const std::pair<_T1, _T2>&)'      
  454 |     operator<(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
      |     ^~~~~~~~
c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\stl_pair.h:454:5: note:   template argument deduction/substitution failed:
In file included from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\algorithm:62,
                 from teste.cpp:5:
c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\stl_algo.h:2259:39: note:   'const main()::<lambda(const body&)>' is not derived from 'const std::pair<_T1, _T2>'
 2259 |       return __i != __last && !(__val < *__i);
      |                                ~~~~~~~^~~~~~~
In file included from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\stl_algobase.h:67,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\char_traits.h:39,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\ios:40,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\ostream:38,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\iostream:39,
                 from teste.cpp:1:
c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\stl_iterator.h:331:5: note: candidate: 'template<class _Iterator> bool std::operator<(const std::reverse_iterator<_Iterator>&, const std::reverse_iterator<_Iterator>&)'
  331 |     operator<(const reverse_iterator<_Iterator>& __x,
      |     ^~~~~~~~
c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\stl_iterator.h:331:5: note:   template argument deduction/substitution failed:
In file included from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\algorithm:62,
                 from teste.cpp:5:
c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\stl_algo.h:2259:39: note:   'const main()::<lambda(const body&)>' is not derived from 'const std::reverse_iterator<_Iterator>'
 2259 |       return __i != __last && !(__val < *__i);
      |                                ~~~~~~~^~~~~~~
In file included from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\stl_algobase.h:67,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\char_traits.h:39,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\ios:40,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\ostream:38,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\iostream:39,
                 from teste.cpp:1:
c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\stl_iterator.h:369:5: note: candidate: 'template<class _IteratorL, class _IteratorR> bool std::operator<(const std::reverse_iterator<_Iterator>&, const std::reverse_iterator<_IteratorR>&)'
  369 |     operator<(const reverse_iterator<_IteratorL>& __x,
      |     ^~~~~~~~
c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\stl_iterator.h:369:5: note:   template argument deduction/substitution failed:
In file included from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\algorithm:62,
                 from teste.cpp:5:
c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\stl_algo.h:2259:39: note:   'const main()::<lambda(const body&)>' is not derived from 'const std::reverse_iterator<_Iterator>'
 2259 |       return __i != __last && !(__val < *__i);
      |                                ~~~~~~~^~~~~~~
In file included from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\stl_algobase.h:67,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\char_traits.h:39,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\ios:40,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\ostream:38,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\iostream:39,
                 from teste.cpp:1:
c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\stl_iterator.h:1163:5: note: candidate: 'template<class _IteratorL, class _IteratorR> bool std::operator<(const std::move_iterator<_IteratorL>&, const std::move_iterator<_IteratorR>&)'
 1163 |     operator<(const move_iterator<_IteratorL>& __x,
      |     ^~~~~~~~
c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\stl_iterator.h:1163:5: note:   template argument deduction/substitution failed:
In file included from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\algorithm:62,
                 from teste.cpp:5:
c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\stl_algo.h:2259:39: note:   'const main()::<lambda(const body&)>' is not derived from 'const std::move_iterator<_IteratorL>'
 2259 |       return __i != __last && !(__val < *__i);
      |                                ~~~~~~~^~~~~~~
In file included from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\stl_algobase.h:67,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\char_traits.h:39,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\ios:40,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\ostream:38,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\iostream:39,
                 from teste.cpp:1:
c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\stl_iterator.h:1169:5: note: candidate: 'template<class _Iterator> bool std::operator<(const std::move_iterator<_IteratorL>&, const std::move_iterator<_IteratorL>&)'
 1169 |     operator<(const move_iterator<_Iterator>& __x,
      |     ^~~~~~~~
c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\stl_iterator.h:1169:5: note:   template argument deduction/substitution failed:
In file included from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\algorithm:62,
                 from teste.cpp:5:
c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\stl_algo.h:2259:39: note:   'const main()::<lambda(const body&)>' is not derived from 'const std::move_iterator<_IteratorL>'
 2259 |       return __i != __last && !(__val < *__i);
      |                                ~~~~~~~^~~~~~~
In file included from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\string:55,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\locale_classes.h:40,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\ios_base.h:41,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\ios:42,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\ostream:38,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\iostream:39,
                 from teste.cpp:1:
c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\basic_string.h:6226:5: note: candidate: 'template<class _CharT, class _Traits, class _Alloc> bool std::operator<(const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&, const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&)'
 6226 |     operator<(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
      |     ^~~~~~~~
c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\basic_string.h:6226:5: note:   template argument deduction/substitution failed:
In file included from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\algorithm:62,
                 from teste.cpp:5:
c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\stl_algo.h:2259:39: note:   'const main()::<lambda(const body&)>' is not derived from 'const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>'
 2259 |       return __i != __last && !(__val < *__i);
      |                                ~~~~~~~^~~~~~~
In file included from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\string:55,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\locale_classes.h:40,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\ios_base.h:41,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\ios:42,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\ostream:38,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\iostream:39,
                 from teste.cpp:1:
c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\basic_string.h:6239:5: note: candidate: 'template<class _CharT, class _Traits, class _Alloc> bool std::operator<(const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&, const _CharT*)'
 6239 |     operator<(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
      |     ^~~~~~~~
c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\basic_string.h:6239:5: note:   template argument deduction/substitution failed:
In file included from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\algorithm:62,
                 from teste.cpp:5:
c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\stl_algo.h:2259:39: note:   'const main()::<lambda(const body&)>' is not derived from 'const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>'
 2259 |       return __i != __last && !(__val < *__i);
      |                                ~~~~~~~^~~~~~~
In file included from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\string:55,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\locale_classes.h:40,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\ios_base.h:41,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\ios:42,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\ostream:38,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\iostream:39,
                 from teste.cpp:1:
c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\basic_string.h:6251:5: note: candidate: 'template<class _CharT, class _Traits, class _Alloc> bool std::operator<(const _CharT*, const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&)'
 6251 |     operator<(const _CharT* __lhs,
      |     ^~~~~~~~
c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\basic_string.h:6251:5: note:   template argument deduction/substitution failed:
In file included from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\algorithm:62,
                 from teste.cpp:5:
c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\stl_algo.h:2259:39: note:   mismatched types 'const _CharT*' and 'main()::<lambda(const body&)>'
 2259 |       return __i != __last && !(__val < *__i);
      |                                ~~~~~~~^~~~~~~
In file included from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\ios_base.h:46,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\ios:42,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\ostream:38,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\iostream:39,
                 from teste.cpp:1:
c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\system_error:208:3: note: candidate: 'bool std::operator<(const std::error_code&, const std::error_code&)'
  208 |   operator<(const error_code& __lhs, const error_code& __rhs) noexcept
      |   ^~~~~~~~
c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\system_error:208:31: note:   no known conversion for argument 1 from 'const main()::<lambda(const body&)>' to 'const std::error_code&'
  208 |   operator<(const error_code& __lhs, const error_code& __rhs) noexcept
      |             ~~~~~~~~~~~~~~~~~~^~~~~
c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\system_error:282:3: note: candidate: 'bool std::operator<(const std::error_condition&, const std::error_condition&)'
  282 |   operator<(const error_condition& __lhs,
      |   ^~~~~~~~
c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\system_error:282:36: note:   no known conversion for argument 1 from 'const main()::<lambda(const body&)>' to 'const std::error_condition&'
  282 |   operator<(const error_condition& __lhs,
      |             ~~~~~~~~~~~~~~~~~~~~~~~^~~~~
In file included from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\vector:67,
                 from teste.cpp:3:
c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\stl_vector.h:1905:5: note: candidate: 'template<class _Tp, class _Alloc> bool std::operator<(const std::vector<_Tp, _Alloc>&, const std::vector<_Tp, _Alloc>&)' 1905 |     operator<(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
      |     ^~~~~~~~
c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\stl_vector.h:1905:5: note:   template argument deduction/substitution failed:
In file included from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\algorithm:62,
                 from teste.cpp:5:
c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\stl_algo.h:2259:39: note:   'const main()::<lambda(const body&)>' is not derived from 'const std::vector<_Tp, _Alloc>'
 2259 |       return __i != __last && !(__val < *__i);
      |                                ~~~~~~~^~~~~~~
c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\stl_algo.h: In instantiation of 'void std::replace_if(_FIter, _FIter, _Predicate, const _Tp&) [with _FIter = __gnu_cxx::__normal_iterator<body*, std::vector<body> >; _Predicate = std::__cxx11::basic_string<char>; _Tp = main()::<lambda(const body&)>]':
teste.cpp:53:82:   required from here
c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\stl_algo.h:4401:12: error: no match for call to '(std::__cxx11::basic_string<char>) (body&)'
 4401 |  if (__pred(*__first))
      |      ~~~~~~^~~~~~~~~~
c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\stl_algo.h:4402:13: error: no match for 'operator=' (operand types are 'body' and 'const main()::<lambda(const body&)>')
 4402 |    *__first = __new_value;
      |    ~~~~~~~~~^~~~~~~~~~~~~
teste.cpp:9:8: note: candidate: 'body& body::operator=(const body&)'
    9 | struct body{
      |        ^~~~
teste.cpp:9:8: note:   no known conversion for argument 1 from 'const main()::<lambda(const body&)>' to 'const body&'
teste.cpp:9:8: note: candidate: 'body& body::operator=(body&&)'
teste.cpp:9:8: note:   no known conversion for argument 1 from 'const main()::<lambda(const body&)>' to 'body&&'
In file included from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\stl_algobase.h:71,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\char_traits.h:39,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\ios:40,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\ostream:38,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\iostream:39,
                 from teste.cpp:1:
c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\predefined_ops.h: In instantiation of 'bool __gnu_cxx::__ops::_Iter_less_val::operator()(_Iterator, _Value&) const [with _Iterator = __gnu_cxx::__normal_iterator<body*, std::vector<body> >; _Value = const main()::<lambda(const body&)>]':
c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\stl_algobase.h:979:14:   required from '_ForwardIterator std::__lower_bound(_ForwardIterator, _ForwardIterator, const _Tp&, _Compare) [with _ForwardIterator = 
__gnu_cxx::__normal_iterator<body*, std::vector<body> >; _Tp = main()::<lambda(const body&)>; _Compare = __gnu_cxx::__ops::_Iter_less_val]'
c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\stl_algo.h:2257:22:   required from 'bool std::binary_search(_FIter, _FIter, const _Tp&) [with _FIter = __gnu_cxx::__normal_iterator<body*, std::vector<body> >; _Tp = main()::<lambda(const body&)>]'
teste.cpp:45:117:   required from here
c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\predefined_ops.h:65:22: error: no match for 'operator<' (operand types are 'body' and 'const main()::<lambda(const body&)>')
   65 |       { return *__it < __val; }
      |                ~~~~~~^~~~~~~
In file included from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\stl_algobase.h:67,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\char_traits.h:39,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\ios:40,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\ostream:38,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\iostream:39,
                 from teste.cpp:1:
c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\stl_iterator.h:915: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>&)'
  915 |     operator<(const __normal_iterator<_IteratorL, _Container>& __lhs,
      |     ^~~~~~~~
c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\stl_iterator.h:915:5: note:   template argument deduction/substitution failed:
In file included from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\stl_algobase.h:71,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\char_traits.h:39,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\ios:40,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\ostream:38,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\iostream:39,
                 from teste.cpp:1:
c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\predefined_ops.h:65:22: note:   'body' is not derived from 'const __gnu_cxx::__normal_iterator<_IteratorL, _Container>'
   65 |       { return *__it < __val; }
      |                ~~~~~~^~~~~~~
In file included from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\stl_algobase.h:67,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\char_traits.h:39,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\ios:40,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\ostream:38,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\iostream:39,
                 from teste.cpp:1:
c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\stl_iterator.h:922:5: note: candidate: 'template<class _Iterator, class _Container> bool __gnu_cxx::operator<(const __gnu_cxx::__normal_iterator<_Iterator, _Container>&, const __gnu_cxx::__normal_iterator<_Iterator, _Container>&)'
  922 |     operator<(const __normal_iterator<_Iterator, _Container>& __lhs,
      |     ^~~~~~~~
c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\stl_iterator.h:922:5: note:   template argument deduction/substitution failed:
In file included from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\stl_algobase.h:71,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\char_traits.h:39,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\ios:40,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\ostream:38,
                 from c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\iostream:39,
                 from teste.cpp:1:
c:\cpp\mingw\lib\gcc\mingw32.2.0\include\c++\bits\predefined_ops.h:65:22: note:   'body' is not derived from 'const __gnu_cxx::__normal_iterator<_Iterator, _Container>'
   65 |       { return *__it < __val; }

编辑:是的,我知道这个例子还没有杂货店,但是有没有杂货店并没有造成问题,因为我正在处理文本文件中的信息,这实际上是最低限度的导致我遇到的问题。

即使与 binary_search 相关的编译器错误已修复(这有点棘手,因为 binary_search 搜索 grocery 而不是 string),它不会帮助你。那是因为 binary_search 需要对向量进行排序才能正常工作,而这里不是。

所以换成std::find_if,没有这个要求:

auto it = std::find_if (produce.begin(), produce.end(), [&] (const grocery &g) {return g.name == tempStr;});

这样做意味着您不需要再次搜索向量以查找匹配项,因为您已经有一个指向它的迭代器。相反,您可以这样做:

if (it != produce.end()){
    cout << "Product has been found!" << endl;
    cout << "What is going to be the new price of the product?";
    string tempStr2;
    getline(cin, tempStr2);
    it->price = tempStr2;
}
else{
    cout << "Product does not exist." << endl;
}

总而言之,一个更好的解决方案。

Live demo