стереть функцию в векторе - PullRequest
0 голосов
/ 15 января 2012

Я пытаюсь выучить с ++.Этот код прекрасно компилируется без функции delSong.Но с этим это не скомпилируется.И я не могу понять, что я делаю неправильно ...: - /

#include <iostream>
#include <vector>
#include <string>

using namespace std;

class Jukebox {

public:
  void addSong(string artist, string title, string filename) {
    songCounter++;
    song s {songCounter, artist, title, filename};
    Songs.push_back(s);
  }

  void delSong(int pos) {
    Songs.erase(pos);
  }

  void printSong(int pos) {
    cout << Songs[pos].no << ". ";
    cout << Songs[pos].artist << " - ";
    cout << Songs[pos].title << " : ";
    cout << Songs[pos].filename << endl;
  }

  void printSongs() {
    for (int i = 0; i < Songs.size(); i++) {
      printSong(i);
    }
  }

  Jukebox(): songCounter(0) {}

private:
  int songCounter;
  struct song {
    int no;
    string artist;
    string title;
    string filename;
  };
  vector<song> Songs;
};

int main() {
  Jukebox jbox;
  jbox.addSong("U2", "Magnificent", "U2-Magnificent.mp3");
  jbox.addSong("Sting", "Englishman in New York", "Sting-Englishman_in_New_York.mp3");
  jbox.addSong("U2", "One", "U2-One.mp3");
  jbox.printSongs();
  return 0;
}

Ответы [ 2 ]

6 голосов
/ 15 января 2012

Посмотрите, как определяется erase:

http://www.cplusplus.com/reference/stl/vector/erase/

iterator erase ( iterator position );
iterator erase ( iterator first, iterator last );

В качестве аргументов используются итераторы, а не индексы.Поэтому вместо

Songs.erase(5);

try:

Songs.erase(Songs.begin() + 5);

begin() возвращает итератор, а +5 перемещает его в позицию, которую необходимо удалить.

2 голосов
/ 15 января 2012

Функция std::vector<T>::erase() не принимает индекс. Требуется итератор. Если вы хотите получить итератор из индекса с контейнером произвольного доступа (например, std::vector<T>), вы можете просто использовать begin() и добавить соответствующее смещение:

this->Songs.erase(this->Songs.begin() + pos);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...