从对的向量中,我如何在C++中找到键
From vector of pairs, how can I find key in C++?
我正在创建对向量,并想检查给定的键是否存在于向量中。我正在尝试使用 std::find_if 但似乎它不起作用。如果我在代码或任何其他方法中做错了什么来查找给定键的元素,有人可以帮助我吗?
std::vector < std::pair < int, char >> myVec;
pair < int, char > p1 = make_pair(1, 'a');
pair < int, char > p2 = make_pair(2, 'b');
pair < int, char > p3 = make_pair(3, 'c');
myVec.push_back(p1);
myVec.push_back(p2);
myVec.push_back(p3);
auto it = std::find_if(myVec.begin(), myVec.end(), [](const std::pair < std::string, int > & element) {
return element.first = 1;
});
if (it == myVec.end()) {
cout << "not foundn";
}
在上面的代码中,我想找到键为 1 的对。 我得到了异常。
例外:
$g++ -o main *.cpp
main.cpp: In lambda function:
main.cpp:19:123: error: passing ‘const std::__cxx11::basic_string<char>’ as ‘this’ argument discards qualifiers [-fpermissive]
auto it = std::find_if(myVec.begin(),myVec.end(),[](const std::pair<std::string, int>& element){ return element.first=1;} );
^
In file included from /usr/include/c++/7/string:52:0,
from /usr/include/c++/7/bits/locale_classes.h:40,
from /usr/include/c++/7/bits/ios_base.h:41,
from /usr/include/c++/7/ios:42,
from /usr/include/c++/7/ostream:38,
from /usr/include/c++/7/iostream:39,
from main.cpp:1:
/usr/include/c++/7/bits/basic_string.h:677:7: note: in call to ‘std::__cxx11::basic_string<_CharT, _Traits, _Alloc>& std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::operator=(_CharT) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’
operator=(_CharT __c)
^~~~~~~~
In file included from /usr/include/c++/7/bits/stl_algobase.h:71:0,
from /usr/include/c++/7/bits/char_traits.h:39,
from /usr/include/c++/7/ios:40,
from /usr/include/c++/7/ostream:38,
from /usr/include/c++/7/iostream:39,
from main.cpp:1:
/usr/include/c++/7/bits/predefined_ops.h: In instantiation of ‘bool __gnu_cxx::__ops::_Iter_pred<_Predicate>::operator()(_Iterator) [with _Iterator = __gnu_cxx::__normal_iterator<std::pair<int, char>*, std::vector<std::pair<int, char> > >; _Predicate = main()::<lambda(const std::pair<std::__cxx11::basic_string<char>, int>&)>]’:
/usr/include/c++/7/bits/stl_algo.h:120:14: required from ‘_RandomAccessIterator std::__find_if(_RandomAccessIterator, _RandomAccessIterator, _Predicate, std::random_access_iterator_tag) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<std::pair<int, char>*, std::vector<std::pair<int, char> > >; _Predicate = __gnu_cxx::__ops::_Iter_pred<main()::<lambda(const std::pair<std::__cxx11::basic_string<char>, int>&)> >]’
/usr/include/c++/7/bits/stl_algo.h:161:23: required from ‘_Iterator std::__find_if(_Iterator, _Iterator, _Predicate) [with _Iterator = __gnu_cxx::__normal_iterator<std::pair<int, char>*, std::vector<std::pair<int, char> > >; _Predicate = __gnu_cxx::__ops::_Iter_pred<main()::<lambda(const std::pair<std::__cxx11::basic_string<char>, int>&)> >]’
/usr/include/c++/7/bits/stl_algo.h:3932:28: required from ‘_IIter std::find_if(_IIter, _IIter, _Predicate) [with _IIter = __gnu_cxx::__normal_iterator<std::pair<int, char>*, std::vector<std::pair<int, char> > >; _Predicate = main()::<lambda(const std::pair<std::__cxx11::basic_string<char>, int>&)>]’
main.cpp:19:127: required from here
/usr/include/c++/7/bits/predefined_ops.h:283:11: error: no match for call to ‘(main()::<lambda(const std::pair<std::__cxx11::basic_string<char>, int>&)>) (std::pair<int, char>&)’
{ return bool(_M_pred(*__it)); }
^~~~~~~~~~~~~~~~~~~~
/usr/include/c++/7/bits/predefined_ops.h:283:11: note: candidate: std::__cxx11::basic_string<char> (*)(const std::pair<std::__cxx11::basic_string<char>, int>&) <conversion>
/usr/include/c++/7/bits/predefined_ops.h:283:11: note: candidate expects 2 arguments, 2 provided
main.cpp:19:99: note: candidate: main()::<lambda(const std::pair<std::__cxx11::basic_string<char>, int>&)>
auto it = std::find_if(myVec.begin(),myVec.end(),[](const std::pair<std::string, int>& element){ return element.first=1;} );
^
main.cpp:19:99: note: no known conversion for argument 1 from ‘std::pair<int, char>’ to ‘const std::pair<std::__cxx11::basic_string<char>, int>&’
main.cpp
这似乎是一个简单的错字。您将向量声明为 std::vector<std::pair<int, char>>
但您使用的 lambda 表达式需要const std::pair<std::string, char>&
。只需将std::string
更改为int
,应该没问题。
编辑:此外,正如博格领袖指出的那样,= 1
应该== 1
。
std::vector < std::pair < int, char >> myVec; ^^^^^^^^^^^^^^^^^^^^^^^
矢量的元素是std::pair < int, char >
.
auto it = std::find_if(myVec.begin(), myVec.end(), [](const std::pair < std::string, int > & element) { ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
您的 lambda 接受对 std::pair < std::string, int >
的引用。此类引用不能绑定到 std::pair < int, char >
类型的对象。这就是编译器在这里所说的:
no known conversion for argument 1 from ‘std::pair<int, char>’ to ‘const std::pair<std::__cxx11::basic_string<char>, int>&’
若要解决此问题,请使用与元素类型匹配的参数类型。
此外,您的 lambda 会尝试通过 const 引用修改对象。这是格式不正确的。您可能打算改用比较运算符。
相关文章:
- 写入向量<向量<bool>>
- 函数向量_指针有不同的原型,我可以构建一个吗
- std::向量与传递值的动态数组
- 将值指定给向量(2D)的向量中的某个位置
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 如何使用向量的template_back函数
- 尝试通过多个向量访问变量时,向量下标超出范围
- 如何通过派生类函数更改基类中的向量
- C++从另一个类访问公共静态向量的正确方法是什么
- 如何将ampl中的集合表示为c++中的向量
- 变量没有改变?通过向量的函数调用
- 迭代时从向量和内存中删除对象
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 计算排序向量的向量中唯一值的计数
- 矩阵向量乘法(cublasDgemv)返回零
- 一对向量构造函数:初始值设定项列表与显式构造
- 将结构向量排序为子组
- 在C++中调整向量中的索引
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么