-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 に答える