【发布时间】:2017-11-06 16:39:07
【问题描述】:
我有一个包含 Song 对象的集合。 我想搜索所有出现的具有特定标题的歌曲。 我需要使用 STL 算法。
问题是当它找到第一个匹配项时它会停止搜索。
我正在尝试通过使用 while 循环并更改从何处开始搜索来修复它,但我无法让它工作。
原始函数
set<Song> SongLibrary::SearchSong(string title)
{
set<Song> foundSongs;
find_if(begin(m_songs), end(m_songs),[&](Song const& p)
{
if (p.getTitle() == title)
{
foundSongs.insert(p);
}
return p.getTitle() == title; });
return foundSongs;
}
这是我尝试修改它以使用 while 循环
while (startSearch != m_songs.end)
{
find_if(startSearch, end(m_songs), [&](Song const& p) // wont take start search as a parameter
{
if (p.getTitle() == title)
{
startSearch == m_songs.Position(); // this Line is wrong
foundSongs.insert(p);
}
return p.getTitle() == title; });
}
尝试使用 Copy_if
copy_if(m_songs.begin(), m_songs.end(), foundSongs, [&](Song const& s), s.getTitle() == title);
【问题讨论】:
-
而不是
std::find_if,您似乎可以使用std::copy_if,因为这就是您真正在做的事情。 -
@tobi303 这是一个不同的问题,从那时起我一直在研究它以返回一个集合
-
std::find_if在找到匹配项时停止搜索。这是设计使然,它将迭代器返回到容器中找到的第一个元素。您只是使用了错误的算法。在我看来,您将std::find_if与std::for_each混淆了。考虑使用std::copy_if代替另一条评论中提到的。 -
@FrançoisAndrieux 我目前正在尝试使用 copy_if,但是如何获得每首歌曲的标题? copy_if(m_songs.begin(), m_songs.end(), foundSongs, Song.getTitle() == title);
-
你可以使用 std::multiset 和基于标题的比较器吗?