按对象数据成员属性搜索对象的向量

Search vector of objects by object data member attribute

本文关键字:对象 向量 搜索 属性 数据成员      更新时间:2023-10-16

我正在编写一个自动唱片机模拟器,我正在尝试按专辑标题搜索专辑对象的向量并返回索引以用于其他函数。该功能将用于许多不同的事情,例如删除相册,打印相册等。

当函数与要搜索的数据成员位于同一类时,我已经让它在以前的应用程序中工作。但是,由于某种原因,我无法使用 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.

显然,getter实际上并没有太多用于比较。不知道为什么它只得到最后一个条目和比较的右侧。

如果我将其添加到上面的任何函数中,它会正确获取并显示相册标题。在调用findAlbumIdx(key);之前以及在 findAlbumIdx 函数内部,向量似乎很好。

for(unsigned int i = 0; i < albvec.size(); ++i)
    cout << albvec[i].getAlbum() << endl;

读取到要搜索的矢量中的原始播放列表文件具有 dos 换行符,在使用 dos2unix 转换后(因为我正在运行 Linux),搜索,我认为很多其他事情,工作正常。

我想在将文件读取到矢量中时修剪换行符将是更正确的方法。