好的,我在结构列表中打印值时遇到问题。打印列表(使用迭代器)的常规方法不起作用。这是我的代码,我在一个文件中读到我的列表。
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
谢谢。
答案 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}";
}
应该让你开始。
int main
,而不是void main
weight = w;
,而不是weight = w.
i+2
无效。你的意思是i+=2
?如果你这样做,应该修复循环条件以避免越界寻址:
for(size_t i = 1; i+1<tokens.size(); i+=2){
请注意使用size_t
来避免混合signed
/ unsigned
比较
Edge
构造函数应初始化weight
//crutch comment
s,您的代码应该更加清晰:_)考虑使用解析器来读取您的输入。您严重缺乏输入验证,格式灵活性和错误处理。
哦,不要使用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);
}
}
}
}