-1

嗨,我正在尝试使用向量来存储电影列表,但是当我尝试计算电影时,我只得到第一部。我不确定为什么代码会这样做。如果有人可以帮助它会非常感谢。

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());
}
4

2 回答 2

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];
    }
}
于 2013-03-13T09:06:27.143 回答
1

这行不通

Movie* p = *movies.data();

递增此指针不会将其移动到向量的下一个元素,而是移动到某个随机位置。除了直接使用向量的表示之外是一个非常糟糕的主意。

如果它没有找到任何东西也会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;
}
于 2013-03-13T09:05:42.357 回答