按对象数据成员属性搜索对象的向量
Search vector of objects by object data member attribute
我正在编写一个自动唱片机模拟器,我正在尝试按专辑标题搜索专辑对象的向量并返回索引以用于其他函数。该功能将用于许多不同的事情,例如删除相册,打印相册等。
当函数与要搜索的数据成员位于同一类时,我已经让它在以前的应用程序中工作。但是,由于某种原因,我无法使用 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),搜索,我认为很多其他事情,工作正常。
我想在将文件读取到矢量中时修剪换行符将是更正确的方法。
相关文章:
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- 从多个源构造一个对象,包括一个对象向量
- 如何从文件中读取两个字符串和数字数组,并将它们存储在对象向量中
- 对象 C++ 向量的 STL 容器
- 初始化C++中的对象向量
- 从自定义类获取对象向量中的 max 元素
- 如何在 c++ 中打印存档中的对象向量
- 如何将包含另一个对象向量的对象保存到文件中,并使用C++中的二进制文件从文件中读回?
- 尝试重载输出运算符时,我无法遍历对象向量
- 如何在C++中打印对象向量的内容
- 打印出对象向量中的每个元素C++
- 在 c++ 的构造函数中分配对象向量时出错
- 遍历对象向量,并找到与从文本文件中提取的对象匹配的变量
- 对象向量是否在堆或堆栈上分配C++?
- 基于不同字段的对象向量的排序功能
- 有没有一种简单的方法可以在对象向量上调用构造函数?
- 用rapidjson读取子对象向量
- 尝试使用比较运算符对对象向量进行排序
- 如何用对象向量重载 cin(>>)
- 如何将某个元素从shared_ptr擦除到对象向量?