El problema esque el vector<song> tiene un tamaño inicial de cero. Como no redimensionas estas adcediendo a posiciones no reservadas, de modo que levanta una excepción.
Tienes que reservar memoria previamente, te dejo la documentación de la clase vector:
http://www.cplusplus.com/reference/vector/vector/Por cierto en este for:
bool isSongInCollection(const Collection &collection, Song song){
bool repetida=false;
int i;
for(i=0;i<collection.idNextSong;i++){
if(song.title==collection.songs[i].title && collection.songs[i].artist==song.artist){
repetida=true;
}
}
return repetida;
}
Si esta repetida no deberías terminar la función devolviendo true? No tiene sentido seguir buscando.
PD: Olvidate de los typedef, no son necesarios en C++:
struct Song
{
int id; // El identificador de una nueva cancion debe ser igual a idNextSong
string title;
string artist;
string album;
string genre;
string url;
};
Y C++ tiene mecanismos más efectivos para progamación orientada a objetos (las clases). Te recomiendo que te las mires, los mecanismos de encapsulamiento que usa te evitará muchos errores.
Saludos.