打印带有地图的结构

时间:2014-04-20 22:52:02

标签: c++ printing map struct hashtable

好的,我在结构列表中打印值时遇到问题。打印列表(使用迭代器)的常规方法不起作用。这是我的代码,我在一个文件中读到我的列表。

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++ How to loop through a list of structs and access their properties 这是我的尝试。

//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

谢谢。

1 个答案:

答案 0 :(得分:0)

更新评论:

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 comment s,您的代码应该更加清晰:_)
  7. 考虑使用解析器来读取您的输入。您严重缺乏输入验证,格式灵活性和错误处理。

  8. 哦,不要使用using namespace std

  9. 这是尝试解决一些问题:

    #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);
                }
            }
        }
    }