您好我试图使用矢量来存储电影列表,但当我尝试cout电影我只得到第一个。我不确定为什么代码会这样做。如果有人能提供帮助,我将非常感谢。
Movies::Movies(string fn){loadMovies(fn);}
int Movies::getMovieCount() const {return movies.size();}
const Movie * Movies::getMovie(string mc) const {
Movie* p = *movies.data();
for(unsigned int i = 0; i < movies.size(); i++)
{
if(p->getTitle().find(mc) ==string::npos)
{
cout<<string::npos;
printf("test:%d\n",i);
return p;
}
p++;
}
return NULL;
}
Movies::~Movies() {
for(std::vector<Movie*>::const_iterator ptr = movies.begin(); ptr != movies.end(); ptr++)
{
delete *ptr;
}
}
void Movies::loadMovies(string fn) {
ifstream iS(fn); // technically should be c_str
string s;
getline(iS, s); // skip heading
getline(iS, s);
while(!iS.eof()) {
Movie* m = new Movie(s);
movies.push_back(m);
getline(iS, s);
}
iS.close();
sort(movies.begin(), movies.end());
}
答案 0 :(得分:2)
行Movie* p = *movies.data();
从向量中获取第一个指针(以奇怪的方式)。但是,p++
不会为您提供下一个指针,而是将p
更改为指向第一部电影后的空间,而不是下一部电影。
我认为如果您跳过指针p
并使用
for(unsigned int i = 0; i < movies.size(); i++)
{
if(movies[i]->getTitle().find(mc) ==string::npos)
{
cout<<string::npos;
printf("test:%d\n",i);
return movies[i];
}
}
答案 1 :(得分:1)
这不会起作用
Movie* p = *movies.data();
递增此指针不会将其移动到向量的下一个元素,而是移动到某个随机位置。除了直接使用vector的表示是一个非常糟糕的主意。
find
如果找不到任何内容,也会返回npos
,因此您需要更改条件。
这是实现搜索的正确方法
const Movie * Movies::getMovie(string mc) const
{
for(auto I = moves.begin(); I != movies.end(); ++I)
{
if((*I)->getTitle().find(mc) != string::npos)
{
return *I;
}
}
return nullptr;
}