【发布时间】:2021-06-19 20:26:45
【问题描述】:
我是 C++ STL 的新手。我正在编写一个函数来检查一个向量是否是另一个向量的子集(重复元素也算在内)并打印“是”或“否”。我想出了以下代码:
void checkMagazine(vector<string> magazine, vector<string> note) {
vector<string>::iterator a;
for(int i=0;i<note.size();i++)
{
a=find(magazine.begin(),magazine.end(),note[i]);
if(a==magazine.end())
{
printf("No");
return;
}else magazine.erase(a-magazine.begin());
}
printf("Yes");
}
但是,我收到以下编译错误:
error: no matching function for call to ‘std::vector<std::__cxx11::basic_string<char>
>::erase(__gnu_cxx::__normal_iterator<std::__cxx11::basic_string<char>*,
std::vector<std::__cxx11::basic_string<char> > >::difference_type)’
}else magazine.erase(a-magazine.begin());
我正在尝试使用擦除删除杂志中找到的元素。迭代器的声明类型有问题吗?为什么会这样? 此外,如果有其他方法/逻辑/内置函数可以使用 STL 完成所需的工作,请告诉我,因为我是新手并正在努力学习它。
【问题讨论】:
-
您认为
magazine.erase(a-magazine.begin())应该致电overloadederasefunctions 中的哪一个?您认为a-magazine.begin()的评估结果是什么? -
我认为擦除是一个内置的 STL 函数,可用于删除向量中的元素或元素范围。
-
你是对的。但是您的论点没有指定“一个元素或元素范围”。
-
a-magazine.begin() 会给出找到的元素的索引或位置...错了吗?
-
不,没错。但是您是否看到任何接受索引的向量的
erase函数?如果您感到困惑,那么我建议您了解迭代器。迭代器和索引是两个不同的概念。