c ++:如何改变动态指针数组?

时间:2012-02-29 09:34:43

标签: c++ arrays pointers struct

我正在为我的程序改组歌曲,但我有点困惑,因为当我尝试编译时告诉我,我不能将我的结构与int进行比较。我想知道你们会怎么想?

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

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

所以我告诉你结构和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 
 }      
}

5 个答案:

答案 0 :(得分: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

答案 1 :(得分: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;
}

答案 2 :(得分:1)

您正尝试将Songs对象分配给intint temp = ptr[i];),然后尝试将int分配给Songsptr[r] = temp;)。那样不行。为了使它工作,我建议你将行改为:     Songs temp = ptr[i]; ptr[i] = ptr[r]; ptr[r] = temp;

答案 3 :(得分:1)

变化:

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

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

您的原始代码尝试将Songs分配给整数。您需要创建一个与您尝试分配它的对象相同类型的临时文件。

答案 4 :(得分:1)

那么,为什么使用int存储结构值?做到这一点:

Songs temp;

此外,您的类型名称完全令人困惑,Songs似乎代表单个歌曲。