2012-02-29 30 views
2

我为我的程序洗牌歌曲,但我有点困惑,因为当我尝试编译器告诉我,我不能比较我的结构到一个int。我想知道你可能会想什么?C++:如何洗牌动态数组指针?

struct Songs     //my struct 
{ 
string title;  
string artist; 
string mem; 
}; 

Songs *ptr; 
ptr = new Songs[25]; //dynamic array 

,所以我告诉U中的结构和PTR以及继承人的功能IM遇到问题..

void shuffle (Songs song[], Songs *ptr, string title, string mem, string artist, int num) 
{ 

for (int i=0; i<(num); i++) 
{ 
    int r = i + (rand() % (num-i)); // Random remaining position. 
    int temp = ptr[i]; ptr[i] = ptr[r]; ptr[r] = temp; //this isnt working 
}              //but its logically sound? 

for (int c=0; c<n; c++) 
{ 
    cout << ptr[c] << " "; // Just print 
}  
} 
+2

这是* not *指针数组。另外,你的函数中有很多未使用的参数。故意地? – 2012-02-29 09:38:32

+0

啊为未使用的参数道歉 – gamergirl22 2012-02-29 09:50:47

回答

3

有问题的代码是int temp = ptr[i]; ... ptr[r] = temp;,你指定Songint这是不可能的。

此外,我强烈建议使用std::vector<Song>存储。你的代码更健壮,并且崩溃的可能性更小,加上矢量总是知道它包含的歌曲的数量。例如

#include <vector> 
... 
struct Song { ... }; 
... 
void shuffle(std::vector<Song>& mySongs, ...) 
{ 
    /* shuffle mySongs somehow. */ 
    ... 
} 

mySongs.size()包含的歌曲数量,并且可以与预期mySongs[index](或更好mySongs.at(index))访问每首歌曲。添加新歌曲由mySongs.push_back(someSong)完成。

现在你的问题:我如何洗牌我的歌曲的矢量。那么......

/* at start of program. */ 
srand(unsigned(time(NULL))); 
... 
void shuffle(std::vector<Song>& mySongs) 
{ 
    std::random_shuffle(mySongs.begin(), mySongs.end()); 
} 

有窍门。见here

写一首歌给流可以通过定义这样一个函数来完成:

std::ostream& operator << (std::ostream& osr, const Song& mySong) 
{ 
    osr << mySong.title << ' ' << mySong.artitst << ' ' << mySong.mem; 
    return osr; 
} 

现在你可以快乐地做std::cout << mySong << std::endl

+0

thnx为了这个帮助..现在洗牌很好,但是矢量对我来说是新的。像我会定期排列的那样,我是否会对他们进行评估例如:for(int i = 0; i gamergirl22 2012-02-29 10:01:33

+0

应该按预期工作。更好的是,你可以给你的Song对象一个将它写入流的函数。我会在几个答案中加入我的答案。 – hochl 2012-02-29 10:07:47

+0

thnx再次。 idk为什么我们不教授载体,但他们似乎更简单。我现在要自己研究这些,因为它们看起来非常有用。 – gamergirl22 2012-02-29 10:11:14

1

您试图分配Songs对象的intint temp = ptr[i];),然后尝试将int分配给Songsptr[r] = temp;)。这是行不通的。为了使它工作,我建议你换行到: Songs temp = ptr[i]; ptr[i] = ptr[r]; ptr[r] = temp;

1

变化:

int temp = ptr[i]; ptr[i] = ptr[r]; ptr[r] = temp; 

Songs temp = ptr[i]; ptr[i] = ptr[r]; ptr[r] = temp; 

你原来的代码试图将Songs分配到一个整数。您需要创建一个与您要分配对象的对象类型相同的临时对象。

+1

更好的是,只需使用'std :: swap(ptr [i],ptr [r])''。 – 2012-02-29 09:41:19

+3

更好的做法是使用'std :: vector'和'std :: random_shuffle(v.begin(),v.end())'来完成整个事情,但这不是真正的问题:) – Dervall 2012-02-29 09:44:03

1

那么,为什么你使用int来存储结构值?只是使它:

Songs temp; 

而且,你的类型名称是完全混乱,Songs似乎代表着一个歌曲。

+0

ah apolgies结构似乎对我来说,所有的歌曲,而1歌是每个数据thnx – gamergirl22 2012-02-29 09:40:14

2

你应该真的尝试使用更多的标准库。使用std :: vector和std :: random_shuffle,这将会非常干净。 编辑:现在输出代码。

#include <iostream> 
#include <ostream> 
#include <algorithm> 
#include <string> 
#include <vector> 

struct song 
{ 
    std::string title;  
    std::string artist; 
    std::string mem; 
}; 

std::ostream& operator << (std::ostream& stream, const song& s) 
{ 
    return stream << "Song: { Title: " << s.title 
     << ", Artist: " << s.artist << ", Mem: " << s.mem; 
} 

template <typename T> 
std::ostream& operator << (std::ostream& stream, const std::vector<T>& v) 
{ 
    stream << '['; 
    for (auto i = v.begin(); i != v.end(); ++i) 
     stream << *i << ", \n"; 
    return stream << ']'; 
} 
int main() 
{ 
    std::vector<song> songs; 
    // .push_back your songs 
    std::random_shuffle(songs.begin(), songs.end()); 
    std::cout << songs; 
} 
+0

哇有趣..我们没有得到载体,但这似乎很简单。我是否也将矢量传递给函数? thnx再 – gamergirl22 2012-02-29 09:50:08

+0

嗯,向量基本上是你的动态数组,但你不需要打扰手动调整大小/释放等。 - random_shuffle是一个模板函数,你传递迭代器,开始指向第一个和结束后的最后元件。 – cooky451 2012-02-29 09:53:30

+0

谢谢你。你会建议我cout << vector 来写shuffle吗? – gamergirl22 2012-02-29 10:03:53