2016-05-27 19 views
1

Ich möchte so etwas wie dies tun:Wie setze ich ein Präfix für std :: ostream_iterator?

std::ofstream ch("ch_out.txt"); 
std::ostream_iterator<cgal_class> out("p ", ch, "\n"); 

Ist das überhaupt möglich? Ich mache mir Sorgen, weil meine Forschung nein sagt, ich hoffe, es ist gebrochen. :)


Das Ziel ist es, die konvexe Hülle Punkte durch CGAL produziert zu nehmen und sie in einer Datei wie folgt schreiben:

p 2 0 
p 0 0 
p 5 4 

mit diesem Code:

std::ofstream ch("ch_out.txt"); 
std::ostream_iterator<Point_2> out("p ", ch, "\n"); 
CGAL::ch_graham_andrew(in_start, in_end, out); 

und die Problem ist, dass ich die CGAL-Funktion nicht berühren will/kann.

+1

Ihre Forschung richtig war. Was genau versuchst du zu tun? – jrok

+0

Bietet die Bearbeitung Hilfe @ Jrok. Eine negative Antwort wird akzeptiert, so dass die nächste Person nicht fragen muss. :) – gsamaras

+0

Geben Sie das Präfix in der Klasse "Point_2" aus. – 0x499602D2

Antwort

3

Sie müssen die operator<< für die Klasse std::ostream überladen, damit es "weiß", wie eine Instanz Ihrer benutzerdefinierten Klasse gedruckt wird.

Hier ist ein minimales Beispiel dafür, was ich verstehe, Sie erreichen möchten:

#include <iostream> 
#include <iterator> 
#include <vector> 
#include <algorithm> 

class MyClass { 
private: 
    int x_; 
    int y_; 
public: 
    MyClass(int x, int y): x_(x), y_(y) {} 

    int x() const { return x_; } 
    int y() const { return y_; } 
}; 

std::ostream& operator<<(std::ostream& os, const MyClass &c) { 
    os << "p " << c.x() << " " << c.y(); 
    return os; 
} 

int main() { 
    std::vector<MyClass> myvector; 
    for (int i = 1; i != 10; ++i) { 
    myvector.push_back(MyClass(i, 2*i)); 
    } 

    std::ostream_iterator<MyClass> out_it(std::cout, "\n"); 
    std::copy(myvector.begin(), myvector.end(), out_it); 

    return 0; 
}