Как вывести вектор через map?

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Frairs
Сообщения: 19
Зарегистрирован: 25 фев 2013, 20:04

Пишу архиватор. С контейнирами только знакомлюсь. Всё получалось до тех пор пока не пришлось вывести map в котором находится символ типа char, и vector<bool>. По алгоритму Хаффмана моя программа строит дерево, каждому символу присваивает соответствующий код в зависимости от частоты появления этого символа. Вот собственно сам код:

Код: Выделить всё

#include <iostream>
#include <vector>
#include <list>
#include <map>
#include <stdio.h>

using namespace std;
class Node {
    public:
    int a;
    char c;
    Node *left, *right;
    Node (){};
    Node (Node *L, Node *R)
    {
        left = L;
        right = R;
        a=L->a+R->a;
    }
};

struct MyCompare
{
    bool operator()(Node* l, Node* r) const
    {
        return l->a < r->a;
    }
};

vector <bool> code;
map <char, vector<bool> > table;
map <char, vector<bool> >::iterator itrCode;


void BuildTable (Node *root)
{

    if (root->left!=NULL)
    {
        code.push_back(0);
        BuildTable (root->left);
    }

    if (root->right!=NULL)
    {
        code.push_back(1);
        BuildTable (root->right);
    }

    if (root->c)
    {
        table[root->c]=code;
    }
    code.pop_back();


}
void print (Node* root, unsigned k=0)
{
    if (root!=NULL)
    {
        print (root->left, k+3);

        for (unsigned i=0; i<k; i++)
        {
            cout << "   ";
        }

        if (root->c) cout << root->a << " (" << root->c << ") " << endl;
        else cout << root->a <<endl;
        print(root->right, k+3);
    }
}
int main()
{
string s="Waiting for the san";

map <char, int> m;

for (int i=0; i<s.length(); i++)
{
    char c=s[i];
    m[c]++;

}
map <char, int>::iterator itr;
list<Node*> t;
for (itr=m.begin(); itr!=m.end(); itr++)
{
    //cout << itr->first << ":" << itr->second << endl;
    Node *p=new Node;

    p->c=itr->first;
    p->a=itr->second;

    t.push_back(p);

}

while (t.size()!=1)
{
    t.sort (MyCompare());

    Node *SonL=t.front();
    t.pop_front();

    Node *SonR=t.front();
    t.pop_front();
    Node *parent = new Node(SonL, SonR);
    t.push_back(parent);

    }


   Node *root=t.front();

//unsigned k=0;
 //print (root, k);

 BuildTable (root);

for (itrCode=table.begin(); itrCode!=table.end(); itrCode++)
{
    cout << itrCode->first << itrCode->second;
}

}

Вот этот вывод который я пытался написать:

Код: Выделить всё

for (itrCode=table.begin(); itrCode!=table.end(); itrCode++)
{
    cout << itrCode->first << itrCode->second;
}
Но ему это не нравится. Если просто писать

Код: Выделить всё

cout << itrCode->first;
то всё хорошо, как только пытаюсь второй элемент (вектор) вывести, тут он не хочет. Подскажите что не так я делаю. Уже всю голову сломал.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

У тебя second в мапе является вектором, а не build-in значением. Так что у stream'а нету соответствующего оператора <<, чтобы вывести его.

Выводить придётся руками:

Код: Выделить всё

for (itrCode=table.begin(); itrCode!=table.end(); itrCode++)
{
    cout << itrCode->first << ": ";
    vector<bool>& vec = itrCode->second;
    for (vector<bool>::iterator it = vec.begin(); it != vec.end(); ++it)
    {
        cout << *it << " ";
    }
    cout << endl;
}
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Frairs
Сообщения: 19
Зарегистрирован: 25 фев 2013, 20:04

Romeo писал(а):У тебя second в мапе является вектором, а не build-in значением. Так что у stream'а нету соответствующего оператора <<, чтобы вывести его.

Выводить придётся руками:

Код: Выделить всё

for (itrCode=table.begin(); itrCode!=table.end(); itrCode++)
{
    cout << itrCode->first << ": ";
    vector<bool>& vec = itrCode->second;
    for (vector<bool>::iterator it = vec.begin(); it != vec.end(); ++it)
    {
        cout << *it << " ";
    }
    cout << endl;
}

Спасибо, буду знать.
Albor
Сообщения: 491
Зарегистрирован: 06 сен 2004, 13:34
Откуда: Днепропетровск

Вот так можно вывести вектор одной строкой, используя алгоритм копирования:

Код: Выделить всё

   copy(vec.begin(),vec.end(),ostream_iterator<bool>(cout," "));
Ответить