我正在编写一个Jukebox模拟器,我试图按专辑标题搜索Album对象的向量,并返回索引以用于其他功能。该功能可用于许多不同的事情,如删除相册,打印相册等。
当函数与要搜索的数据成员属于同一个Class时,我已经在之前的应用程序中使用它。但是,由于某些原因,我无法使用getter来使用它。无论我输入什么作为搜索关键字,idx都会返回3,尽管向量只包含索引0,1和2(现在只有3个专辑)。 lambda函数似乎能够通过使用getAlbum() - getter访问数据,但不知何故比较不起作用。
我的方法可能完全错误,我会感谢任何正确方向的指示,或建议如何使用其他技术实现所需的结果。
int Jukebox::findAlbumIdx(string key)
{
// Get search predicate
auto it = find_if(albvec.begin(), albvec.end(), [key](Album const &a)
{
return (a.getAlbum() == key);
});
int idx = it - albvec.begin();
return idx;
}
void Jukebox::delAlbum()
{
cin.get();
string key;
cout << "Input title of album to delete: ";
getline(cin, key);
int idx = findAlbumIdx(key);
if(idx > albvec.size() - 1)
cout << "No hits." << endl;
else
albvec.erase(albvec.begin() + idx);
}
getAlbum只是一个简单的内联getter:
string getAlbum() const {return album_title;}
根据Jonathan Wakely的建议,在lambda中添加std::cout << a.getAlbum() << " == " << key << std::endl;
输出是这样的:
Input title of album to delete: Abbey Road
== Abbey Road
== Abbey Road
== Abbey RoadLonely Hearts Club Band
No hits.
显然,吸气剂实际上并没有太多用于比较。不确定为什么它只能获得最后一个条目并且在比较的右侧。
如果我将其添加到上面的任何功能中,它会正确显示相册标题。在调用findAlbumIdx(key);
之前以及findAlbumIdx
函数内部之前,向量似乎没问题。
for(unsigned int i = 0; i < albvec.size(); ++i)
cout << albvec[i].getAlbum() << endl;
答案 0 :(得分:0)
读取到要搜索的向量中的原始播放列表文件在使用dos2unix
(因为我正在运行Linux)进行转换后使用了dos换行符,并且我推测了很多其他的东西,工作正常。
我认为在将文件读入矢量时修剪换行符将是更正确的方法。