使用ostream_iterator和operator <<来显示指针向量

Moe*_*bai 1 c++ stl vector

我正在尝试使用ostream_iterator和显示对象上的指针向量operator <<.因此,我覆盖了operator <<.我总是得到矢量元素地址的问题.如何使迭代器打印实际值?我需要专门化吗?

class A {
private:
    double x;
    long y;
public:

    A(long xx, double yy) :x(xx), y(yy){};
    ~A();
    void Display();
};

template<typename T>
std::ostream &operator <<(std::ostream &os, const std::vector<T> &v) {
    using namespace std;
    copy(v.begin(), v.end(), ostream_iterator<T>(os, "\n"));
    return os;
}

int main()
{
    std::vector<A*> aVect;
    FillA(aVect);
    cout << accountVect;

    return 0;
}
//
output
00657990
006579D0
00657A48
Run Code Online (Sandbox Code Playgroud)

Use*_*ess 5

你可以写一个operator<<重载A*,但是首先取消引用指针会更好一点,如:

template<typename T>
std::ostream &operator <<(std::ostream &os, const std::vector<T *> &v) {
    std::transform(v.begin(), v.end(),
                   ostream_iterator<T>(os, "\n"),
                   [](T const *ptr) -> T const& { return *ptr; }
                  );
    return os;
}
Run Code Online (Sandbox Code Playgroud)

然后写出通常的operator<<重载A.


注意 - 正如评论中提到的@WhozCraig,您现有的代码不会打印向量元素的地址,而是按照您的要求打印向量元素,并且该元素一个地址.如果可以的话,最简单的解决方法是首先使用a vector<A>.

但是,我假设您需要保留vector<A*>并希望打印取消引用的A对象.

此外,我坚持使用您的原始模板,但不完全清楚非模板化operator<<(ostream&, vector<A*> const &)是否更清晰.