可修改的数组

时间:2012-01-14 09:37:40

标签: c++ multidimensional-array

所以,我知道一些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 ++中实现这一目的的一种可能方式。但它实现起来看起来并不容易吗?

还有一件事,我还想稍后添加一种排序方法,所以当你提出解决方案时请记住这一点,这样我就不会陷入另一个死胡同...... :)

2 个答案:

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