我需要删除所有相同的单词(如果单词以相同的字母开头,则它们是相同的(我的比较功能做下一步:
H J
J H
H I
因此,我需要将每封信与其他进行比较
bool compare(string a, string b) {
cout << a.front() << " " << b.front() << endl;
return(a.front() == b.front());
}
void Fifth_task(list <string>& lst) {
list <string> ::iterator it;
lst.unique(compare);
for (it = lst.begin(); it != lst.end(); ++it) {
cout << *it << endl;
}
}
int main(){
list <string> first;
first.push_back("Hello");
first.push_back("Johnny");
first.push_back("Hello");
first.push_back("Ildar");
Fifth_task(first);
return 0;
}
最后我应该得到三个字:你好,强尼,伊尔达我该怎么做?
从cppreference,unique将。。。
从范围内的每个连续的等价元素组中消除除第一个元素之外的所有元素
(强调矿(
在该页的示例中,在{1,2,1,1,3,3,3,4,5,4}
上调用unique()
将生成{1 2 1 3 4 5 4 x x x}
。请注意如何不删除重复的1和4。这是因为他们不在"连续组"中
因此,为了确保以同一个字母开头的单词都在"连续组"中,请首先对列表进行排序:
void Fifth_task(list <string>& lst) {
lst.sort();
lst.unique(compare);
// ...
请在此处查看其实际操作:https://ideone.com/1i48nj
std::list::unique
删除相邻的重复项。你给它的谓词是用来比较相邻项的相等性的。这不是你想要的,因为你想将一个项目与以前的所有项目进行比较。
您可以使用list::remove_if
,使用一个集合来记录已经看到的第一个字母。所以我会把你的Fifth_task
函数改成这样:
void Fifth_task(std::list<std::string>& lst) {
std::list<std::string>::iterator it;
std::set<char> seen;
lst.remove_if([&](const std::string& s) {
char c = std::tolower(s[0]);
bool remove = (seen.count(c) > 0);
seen.insert(c);
return remove; });
for (it = lst.begin(); it != lst.end(); ++it) {
std::cout << *it << std::endl;
}
}
此处为工作版本:https://godbolt.org/z/WLwQeZ