2012-05-15 4 views
0

Я думал, что делаю это правильно, но похоже, что это не работает. Я в основном экспериментирую с очередью, и он отлично работает с одним типом данных, но теперь я пытаюсь добавить несколько (в конце я хочу иметь int и список ints).создание очереди C++ с более чем одним типом данных?

Вот код:

#include <iostream> 
#include <queue> 
using namespace std; 

int main() 
{ 
    struct product { 
     int x; 
     int y; 
    } ; 


    queue<product> q; 
    q.push(100, 100); 
    q.push(200, 100); 
    q.push(300, 100); 
    q.push(400, 100); 

    cout << "Size of the queue: " << q.size() << endl; 

    while (!q.empty()) { 
     cout << q.front() << endl; 
     q.pop(); 
    } 

} 

Он работает без структуры, но, очевидно, она принимает только одну переменную для каждого элемента в очереди таким образом. Есть ли способ иметь несколько элементов?

+0

Ваш вопрос неясно. Что вы понимаете, добавляя несколько элементов? – Attila

+0

@Attila Мне нужна очередь с несколькими типами данных для каждого элемента очереди. Таким образом, в этом примере каждый элемент очереди имеет два типа int. – Lostsoul

+0

У вас не может быть 'queue' с более чем одним типом данных, но вы можете иметь' queue' из предложенных вариантов по нескольким типам данных. Посмотрите на Boost.Variant. –

ответ

3

Я думаю типа, указанный для данного типа шаблона не может быть локальным определением. Изменить на:

struct product { 
    int x; 
    int y; 
} ; 

int main() 
{ 

Как и другие уже говорилось, добавить конструктор product, который принимает оба аргумента:

struct product { 
    int x; 
    int y; 
    product(int a_x, int a_y) : x(a_x), y(a_y) {} 
}; 

... 

q.push_back(product(100, 100)); 

Вы также можете перегрузить operator<< для вывода product:

std::ostream& operator<<(std::ostream& a_out, const product& a_p) 
{ 
    a_out << "product(" << a_p.x << ", " << a_p.y << ")"; 
    return a_out; 
} 

while (!q.empty()) { 
    cout << q.front() << endl; 
    q.pop(); 
} 
+0

И конструктор, о котором говорили другие. – RedX

+0

+1 Вот и все! – Lostsoul

+0

Интересно, что локальный тип можно определить как параметр шаблона, по крайней мере, в VS 2010. Код, который я написал как ответ, отлично работает с VS 2010. – Jaywalker

2

Вот как ваш главный должен выглядеть. Обратите внимание на добавление конструктора product(int i, int j) и использование конструктора при добавлении элементов в q.

int main() 
{ 
    struct product { 
     int x; 
     int y; 

     product (int i, int j) : x(i), y(j) {} 
    } ; 

    queue<product> q; 
    q.push(product (100, 100)); 
    q.push(product (200, 100)); 
    q.push(product (300, 100)); 
    q.push(product (400, 100)); 

    cout << "Size of the queue: " << q.size() << endl; 

    while (!q.empty()) { 
     cout << q.front().x << ", " << q.front().y << endl; 
     q.pop(); 
    } 

    return 0; 
} 
+0

Кажется, это не работает для меня. Я получаю кучу ошибок. аргумент шаблона недействителен, недопустимый тип в объявлении до ';' и т. д. – Lostsoul

+0

первые 4 ошибки, похоже, связаны с линией 'queue q;' – Lostsoul

+0

Ответ hmjd, и ваш сделал это. Мне не хватало конструктора, и он не мог быть локально объявлен. – Lostsoul

2

q.push(100, 100) является недействительным, queue::push() принимает только один параметр. Вам нужно будет нажать product вместо:

product p(100, 100); 
q.push(p); 

Тогда вы оба 100s в очереди (хранится в stucture продукта).

Если вы хотите сохранить как product1, так и product2, вам понадобится общая базовая структура, которая расширяет и сохраняет указатели (на базу), а не сами значения (для обрезки на avoud). На этом этапе вы также можете использовать class вместо struct

3

Метод queue::push ожидает один параметр, который должен быть типа вашей очереди. Попробуйте так:

queue<product> q; 
q.push(product(100, 100)); 
q.push(product(200, 100)); 
q.push(product(300, 100)); 
q.push(product(400, 100)); 

Вы бы также определить конструктор для структуры:

struct product { 
    int x; 
    int y; 
    product(int _x, int _y) : x(_x), y(_y) {} 
} ; 
+0

Я вижу, что получаю ту же ошибку (ваш подход такой же, как у Jaywalker's). и если я использую ваш конструктор или его, я все равно получаю ту же проблему. – Lostsoul

Смежные вопросы