所以,我知道一些Python,但我认为我应该尝试为这些知识添加一些c ++。这是我写的代码,我正在玩(它实际上是一些python代码的重写)。它将一些歌曲数据添加到一个类(或类中的多维数组)。到现在为止还挺好。大多数都有效。但我坚持使用delSong
方法。我不认为我可以用数组来实现它,所以看起来我已经走到了尽头。我读了一些关于向量的内容,但是他们不会让med删除中间的项目。我怎么能进一步?我应该放弃其他的数组吗?但那会是什么呢?
#include <iostream>
#include <string>
using namespace std;
class Jukebox{
public:
void addSong(string artist, string title, string filename) {
songs [songsCounter][0] = artist;
songs [songsCounter][1] = title;
songs [songsCounter][2] = filename;
songsCounter++;
}
void printSong (int song) {
cout << songs[song][0] << " - ";
cout << songs[song][1] << " : ";
cout << songs[song][2] << endl;
}
void printSongs () {
int song;
for (song=0; song<songsCounter; song++ ) {
cout << songs[song][0] << " - ";
cout << songs[song][1] << " : ";
cout << songs[song][2] << endl;
}
}
void delSong(int song) {
// Some code here
}
private:
int songsCounter;
string songs [512][3];
};
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;
}
在我的python代码中,我实际上在内存中使用sqlite3 db。但我还可以用一个简单的元组列表来编写它。这与我在这里尝试的方法类似。但是内存中的sqlite数据库也是我在c ++中实现这一目的的一种可能方式。但它实现起来看起来并不容易吗?
还有一件事,我还想稍后添加一种排序方法,所以当你提出解决方案时请记住这一点,这样我就不会陷入另一个死胡同...... :)
答案 0 :(得分:4)
矢量允许在中间删除(查找erase
函数),尽管速度不是很快。
我建议使用结构向量而不是多维数组。
struct song {
string artist;
string title;
string filename;
};
然后在Jukebox
:
vector<song> songs;
矢量会根据需要增长并跟踪其自身的大小,与数组相反。
对于排序,std::sort
标题中有<algorithm>
个函数。
答案 1 :(得分:1)
首先,添加构造函数
点唱机()
{
//在这里做初始化 }
您可以删除矢量中的中间项目 http://www.cplusplus.com/reference/stl/vector/erase/
vector<unsigned int> myvector; // set some values (from 1 to 10) for (i=1; i<=10; i++) myvector.push_back(i); // erase the 6th element myvector.erase (myvector.begin()+5);
另一种方法,修改代码最少的方法是将所有歌曲按照要删除的歌曲向左移动1,然后减少songCounter。
//Assuming song 1 is the song at index 0 and songCounter points to the first
//empty element in the array
//ex: 1,2,3,4,5 becomes 1,3,4,5
void delSong(int song) {
if(song <= 0) return;
if(song < songCounter-1) //we don't want to delete song 500 if we only have 20
{
song--;
while (song != songCounter)
{
songs[song][0] = songs[song+1][0];
songs[song][1] = songs[song+1][1];
songs[song][2] = songs[song+1][2];
song++;
}
}
//this handles case of deleting the last song in addition to the above case
if(song < songCounter)
{
songCounter--;
}
}