C ++: как перемешать динамический массив указателей? - PullRequest
2 голосов
/ 29 февраля 2012

Я перетасовываю песни для своей программы, но я немного сбит с толку, потому что, когда я пытаюсь это сделать, компилятор говорит мне, что я не могу сравнить свою структуру с int.Мне интересно, что мог бы подумать yall?

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 ]

3 голосов
/ 29 февраля 2012

Код ошибки: int temp = ptr[i]; ... ptr[r] = temp;, вы назначаете Song и int, что невозможно.

Дополнительно , я настоятельно рекомендую использовать 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());
}

делает свое дело. Смотрите здесь .

Запись песни в поток может быть выполнена путем определения функции, подобной этой:

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

Теперь вы можете счастливо сделать std::cout << mySong << std::endl.

2 голосов
/ 29 февраля 2012

Вы должны действительно попытаться использовать больше из стандартной библиотеки. С 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;
}
1 голос
/ 29 февраля 2012

Хорошо, почему вы используете int для хранения значения структуры?Просто сделайте это:

Songs temp;

Кроме того, ваши имена типов полностью сбивают с толку, Songs, кажется, представляет одну песню.

1 голос
/ 29 февраля 2012

Изменение:

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

до

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

Ваш исходный код пытается присвоить Songs целое число. Вам необходимо создать временный объект того же типа, что и объект, который вы пытаетесь назначить.

1 голос
/ 29 февраля 2012

Вы пытаетесь назначить объект Songs для int (int temp = ptr[i];), а затем пытаетесь присвоить int для Songs (ptr[r] = temp;). Это не будет работать. Чтобы это работало, я предлагаю вам изменить строку на: Songs temp = ptr[i]; ptr[i] = ptr[r]; ptr[r] = temp;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...