对象内对象的打印向量
print vector of objects within an object
我正在尝试打印对象 Order
(实际上是 Order
的向量)。 Order
有一些数据成员,包括带有其他对象的向量,Purchase
。
我可以自己打印 vector<Purchase>
到 cout
,如果我忽略 vector<Purchase>
成员,我可以打印 vector<Objects>
。但棘手的部分是打印包含 vector<Purchase>
的 vector<Objects>
。
这是我的代码:
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include <algorithm>
#include <sstream>
using namespace std;
struct Purchase {
string name;
double unit_price;
int count;
};
struct Order {
string name;
string adress;
double data;
vector<Purchase> vp;
};
template<typename Iter> //this is my general print-vector function
ostream& print(Iter it1, Iter it2, ostream& os, string s) {
while (it1 != it2) {
os << *it1 << s;
++it1;
}
return os << "\n";
}
ostream& operator<<(ostream& os, Purchase p) {
return os << "(" << p.name << ", " << p.unit_price << ", " << p.count << ")";
}
ostream& operator<<(ostream& os, Order o) {
vector<Purchase> vpo = o.vp;
ostringstream oss;
oss << print(vpo.begin(), vpo.end(), oss, ", "); //This is what I would like to do, but the compiler doesn't like this conversion (from ostream& to ostringstream)
os << o.name << "\n" << o.adress << "\n" << o.data << "\n"
<< oss << "\n";
return os;
}
int main() {
ifstream infile("infile.txt");
vector<Order> vo;
read_order(infile, vo); //a function that reads a txt-file into my vector vo
print(vo.begin(), vo.end(), cout, "");
return 0;
}
如您所见,我想到了使用 ostringstreams
作为临时变量,我会在将 vector<Purchase>
传递给 ostream& os
之前存储它。但这是不行的。什么是解决这个问题的好方法?
我是 C++ 的新手,只是在学习流的不同用途,所以如果这是一个愚蠢的问题,请多多包涵。
最简单的方法是编写 operator<<
的重载,它采用对 std::vector<Purchase>
的 const 引用,然后将向量流式传输到 ostream
:
std::ostream& operator<<(std::ostream& os, const std::vector<Purchase>& v);
看起来你有两个小错别字。
首先,删除指示的部分:
oss << print(vpo.begin(), vpo.end(), oss, ", ")
// ↑↑↑↑↑↑↑
然后,稍后在同一函数中,您无法流式传输 stringstream
,但可以流式传输用作其底层缓冲区的字符串,因此请使用 std::stringstream::str()
:
os << o.name << "\n" << o.adress << "\n" << o.data << "\n"
<< oss.str() << "\n";
// ↑↑↑↑↑↑
有了这些修复,缺失的 read_order
函数被抽象掉,your program compiles。
我正在尝试打印对象 Order
(实际上是 Order
的向量)。 Order
有一些数据成员,包括带有其他对象的向量,Purchase
。
我可以自己打印 vector<Purchase>
到 cout
,如果我忽略 vector<Purchase>
成员,我可以打印 vector<Objects>
。但棘手的部分是打印包含 vector<Purchase>
的 vector<Objects>
。
这是我的代码:
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include <algorithm>
#include <sstream>
using namespace std;
struct Purchase {
string name;
double unit_price;
int count;
};
struct Order {
string name;
string adress;
double data;
vector<Purchase> vp;
};
template<typename Iter> //this is my general print-vector function
ostream& print(Iter it1, Iter it2, ostream& os, string s) {
while (it1 != it2) {
os << *it1 << s;
++it1;
}
return os << "\n";
}
ostream& operator<<(ostream& os, Purchase p) {
return os << "(" << p.name << ", " << p.unit_price << ", " << p.count << ")";
}
ostream& operator<<(ostream& os, Order o) {
vector<Purchase> vpo = o.vp;
ostringstream oss;
oss << print(vpo.begin(), vpo.end(), oss, ", "); //This is what I would like to do, but the compiler doesn't like this conversion (from ostream& to ostringstream)
os << o.name << "\n" << o.adress << "\n" << o.data << "\n"
<< oss << "\n";
return os;
}
int main() {
ifstream infile("infile.txt");
vector<Order> vo;
read_order(infile, vo); //a function that reads a txt-file into my vector vo
print(vo.begin(), vo.end(), cout, "");
return 0;
}
如您所见,我想到了使用 ostringstreams
作为临时变量,我会在将 vector<Purchase>
传递给 ostream& os
之前存储它。但这是不行的。什么是解决这个问题的好方法?
我是 C++ 的新手,只是在学习流的不同用途,所以如果这是一个愚蠢的问题,请多多包涵。
最简单的方法是编写 operator<<
的重载,它采用对 std::vector<Purchase>
的 const 引用,然后将向量流式传输到 ostream
:
std::ostream& operator<<(std::ostream& os, const std::vector<Purchase>& v);
看起来你有两个小错别字。
首先,删除指示的部分:
oss << print(vpo.begin(), vpo.end(), oss, ", ")
// ↑↑↑↑↑↑↑
然后,稍后在同一函数中,您无法流式传输 stringstream
,但可以流式传输用作其底层缓冲区的字符串,因此请使用 std::stringstream::str()
:
os << o.name << "\n" << o.adress << "\n" << o.data << "\n"
<< oss.str() << "\n";
// ↑↑↑↑↑↑
有了这些修复,缺失的 read_order
函数被抽象掉,your program compiles。