不确定为什么代码只打印出第一部电影

时间:2013-03-13 08:53:07

标签: c++ vector

您好我试图使用矢量来存储电影列表,但当我尝试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());
}

2 个答案:

答案 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;
}