печать структуры с картой в ней

Хорошо, у меня проблемы с печатью значений в моем списке структур. Обычный способ печати списка (с помощью итератора) не работает. Это мой код чтения файла в моем списке.

struct Edge{
    map<char, string> edge;
    int weight= -1;

    Edge(){};
    Edge(char v, string e, int w){
      edge.insert(pair<char,string>(v,e));
      weight = w;
    }
};

int main(){
     list<Edge> edges;

        //Read in file//
string line;
char start;
vector<string> tokens;

if(!file.is_open()){
    cout<<"Could not open file\n";
}else{
    while(getline(file,line)){
        tokens.clear();
        start = line.front();
        istringstream iss(line);
        copy(istream_iterator<string>(iss), 
            istream_iterator<string>(),
            back_inserter<vector<string>>(tokens));
        for(int i = 1; i<tokens.size(); i+=2){
            //cout << "Position: " <<i << " = " << tokens.at(i) <<endl;
            //insert into edges list.
                Edge e = Edge(start, tokens.at(i), stoi(tokens.at(i+1)));
                edges.push_back(e);
        }//end for
    }//end while
}//end if-else

 return 0;
}//end main

Векторные токены считываются правильно. Я проверил это с помощью закомментированного cout.

Файл представляет собой файл графа, в котором первый элемент является начальной вершиной, а остальная часть строки отформатирована с использованием конечной вершины ребра и веса этого ребра.

Например:

1 2 3 4 5

Будет означать, что ребро (1,2) имеет вес 3, а ребро (1,4) имеет вес 5.

Я не знаю, правильно ли я прочитал свой список, потому что я не могу понять, как его распечатать. Как мне распечатать края списка?

Или есть лучший способ настроить мою структуру? Возможно, еще одна структура для края, а затем структура с краем и весом?

Пробовал печатать, не работает. Синтаксис даже не работает. :(

Обычный способ распечатать список. Но мне это не нравится, так как у меня есть список структур.

    list<Edge>::iterator it;
    for(it=edges.begin(); it!=edges.end(); it++){
    cout << *it <<endl;
}//end for

И это то, что я нашел, когда искал. Вот что я нашел. C++ Как перебрать список структур и доступ к их свойствам Это моя попытка.

//inside main
    list<Edge>::iterator it;
for(int i = 0; i<edges.size(); i++){
    for_each(edges.begin(), edges.end(), printEdges);
}//end for

//outside main
    void printEdges(Edge &data){
    cout << "( " << data.edge << " )"
     << ": Weight = " << data.weight <<endl;
    }//end printEdges

Спасибо.


person user3342236    schedule 20.04.2014    source источник


Ответы (1)


Обновление для комментария:

friend std::ostream& operator<<(std::ostream& os, Edge const& edge)
{
    os << "Edge { weight:" << edge.weight << " {\n";
    for(edge_map::const_iterator it=edge.edge.begin(); it!=edge.edge.end(); ++it)
    {
        os << "{ '" << it->first << "', \"" << it->second << "\" } ";
    }
    return os << "\n}";
}

Должно помочь вам начать.

  1. это int main, а не void main
  2. это weight = w;, а не weight = w.
  3. Вам нужно увеличить переменную цикла. i+2 не действует. Вы имели в виду i+=2?
  4. Если вы это сделали, условие цикла должно быть исправлено, чтобы избежать выхода за пределы адресации:

        for(size_t i = 1; i+1<tokens.size(); i+=2){
    

    обратите внимание на использование size_t, чтобы избежать смешанного сравнения signed/unsigned

  5. конструктор Edge должен инициализировать weight

  6. Если вам нужны //crutch comments, ваш код должен быть более разборчивым :_)
  7. Рассмотрите возможность использования синтаксического анализатора для чтения вашего ввода. Вам сильно не хватает проверки ввода, гибкости формата и обработки ошибок.

  8. О, не используйте using namespace std

Вот попытка исправить некоторые проблемы:

#include <string>
#include <map>
#include <list>
#include <vector>
#include <iostream>
#include <iterator>

#include <sstream>
#include <fstream>
#include <algorithm>

struct Edge{
    typedef std::map<char, std::string> edge_map;
    edge_map edge;
    int weight;

    Edge() : edge(), weight(0) {};
    Edge(char v, std::string e, int w) : edge(), weight(w)
    {
        edge.insert(std::pair<char,std::string>(v,e));
        weight = w;
    }

    friend std::ostream& operator<<(std::ostream& os, Edge const& edge)
    {
        os << "Edge { weight:" << edge.weight << " {\n";
        for(edge_map::const_iterator it=edge.edge.begin(); it!=edge.edge.end(); ++it)
        {
            os << "{ '" << it->first << "', \"" << it->second << "\" } ";
        }
        return os << "\n}";
    }
};

int main()
{
    std::list<Edge> edges;

    std::string line;
    std::vector<std::string> tokens;

    std::ifstream file("input.txt");

    if(!file.is_open()){
        std::cout<<"Could not open file\n";
    }else{
        while(std::getline(file,line)){
            tokens.clear();
            char start = line.front();
            std::istringstream iss(line);
            std::copy(std::istream_iterator<std::string>(iss), 
                    std::istream_iterator<std::string>(),
                    std::back_inserter<std::vector<std::string>>(tokens));
            for(size_t i = 1; i+1<tokens.size(); i+=2){
                Edge e = Edge(start, tokens.at(i), stoi(tokens.at(i+1)));
                edges.push_back(e);
            }
        }
    }
}
person sehe    schedule 20.04.2014
comment
Извините, что не скопировал и не вставил. Так что они уже были в моем коде. Кроме начального веса. Однако я изменил их в коде здесь. - person user3342236; 21.04.2014
comment
Эм. Это просто здорово. Не стесняйтесь голосовать за жалость. Может быть. - person sehe; 21.04.2014
comment
Мне было интересно, как напечатать мой список ребер Edge. Поскольку обычный способ печати списка не работает (с итератором от edge.begin() до edge.end()). Можете ли вы помочь мне с этой проблемой? - person user3342236; 21.04.2014
comment
@ user3342236 Эээ. Вы не включили какой-либо код, связанный с печатью? Обновление Помогает ли обновление в ответе? - person sehe; 21.04.2014
comment
Добавить это и больше ничего с этим не делать. Заставляет мою программу работать бесконечно. Я должен остановить это вручную. И если бы это сработало, как бы я назвал печать списка в основном? - person user3342236; 21.04.2014
comment
Edge e; std::cout << e; - если ваша программа продолжает работать, то либо (а) ваш входной поток находится в плохом состоянии, и вы не можете его проверить? (b) у вас все еще есть приращение цикла или нарушенное условие (см. 3. и 4.) (c) у вас есть другая проблема :) Попробуйте опубликовать новый вопрос с тегом sscce.org - person sehe; 21.04.2014
comment
Вот демонстрация, исправлена ​​неприятная опечатка (был возврат, которого не должно было быть): .stacked-crooked.com/a/0fe50a71efb6495a - person sehe; 21.04.2014