gpt4 book ai didi

C++:如何洗牌动态指针数组?

转载 作者:太空狗 更新时间:2023-10-29 23:53:43 24 4
gpt4 key购买 nike

我正在为我的程序随机播放歌曲,但我有点困惑,因为当我尝试时,编译器告诉我我无法将我的结构与 int 进行比较。我想知道大家会怎么想?

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

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

所以我告诉你 struct 和 ptr 以及继承我遇到问题的函数..

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
}
}

最佳答案

违规代码位于 int temp = ptr[i]; ... ptr[r] = temp; ,你正在分配 Songint这是不可能的。

此外,我强烈建议使用 std::vector< Song >用于存储。您的代码更健壮并且崩溃的可能性更小,而且 vector 始终知道它包含的歌曲数量。示例

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

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

现在回答您的问题:如何随机播放我的歌曲 vector 。嗯……

/* 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 .

关于C++:如何洗牌动态指针数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9496600/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com