2017-02-08 36 views
1

下面是完全適用於打印類型的值的代碼std::string如何使用std ::複製打印用戶定義類型

std::vector<std::string> v; 
v.push_back("this"); 
v.push_back("is"); 
v.push_back("a"); 
v.push_back("test"); 
std::copy(v.begin(),v.end(),std::ostream_iterator<std::string>(std::cout,",")); 

但是,當我試圖打印用戶定義類型(一結構),代碼不編譯:

struct Rec 
{ 
    int name; 
    int number; 
    int result; 
}; 
int main() 
{ 
    Rec rec1 = {1,1,1}; 
    Rec rec2 = {2,1,1}; 
    Rec rec3 = {3,1,1}; 
    Rec rec4 = {4,1,1}; 
    Rec rec5 = {4,1,1}; 

    std::vector<Rec> v; 
    record.push_back(rec1); 
    record.push_back(rec2); 
    record.push_back(rec3); 
    record.push_back(rec4); 
    record.push_back(rec5); 

    std::copy(v.begin(),v.end(),std::ostream_iterator<Rec>(std::cout,",")); 

    return 1; 
} 

我在這裏丟失了什麼?

+2

你重載'運營商<<爲你的結構? –

+0

不,我現在這樣做 – user2256825

+0

是的,需要重載** ostream **運營商。 – ban

回答

5

std::ostream_iterator

std::ostream_iterator是寫類型T的 連續對象爲單通輸出迭代使用operator<<構建它的 的std::basic_ostream對象。在每次寫入操作後,可選分隔符字符串 被寫入輸出流。寫入 操作在迭代器(不論是否已解除引用) 被分配給時執行。增加std::ostream_iterator是無效的。

(從評論確認)

你是不是對自定義記錄超載operator <<。使用下面的代碼來重載操作符。

ostream& operator<<(ostream& os, const Rec& r) 
{ 
    os << r.name << '-' << r.number << '-' << r.result; 
    return os; 
} 
+0

是否使用find函數打印與模式匹配的記錄的方法 find(sentence.begin(),sentence.end(),「1」); 說如果有兩個記錄的名稱= 1,我需要打印所有匹配它的記錄 – user2256825

+0

像下面這樣,用==運算符重載 for(auto it = v.begin(); it!= v.end ); ++ it) {it = std :: find_if(v.begin(),v。end(),n);如果(* it == n) std :: cout << * it; } 但我沒有使用在這裏找到, – user2256825

+0

使用[std :: copy_if](http://en.cppreference.com/w/cpp/algorithm/copy)與lambda謂詞。 –

6

你需要實現一個流插入運營商的記錄,像這樣:

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

struct Rec 
{ 
    int name; 
    int number; 
    int result; 
}; 

std::ostream& operator<<(std::ostream& os, const Rec& rec) 
{ 
    os << "{name: " << rec.name << ", number: " << rec.number 
     << ", result: " << rec.result << "}"; 
    return os; 
} 

int main() 
{ 
    Rec rec1 = {1, 1, 1}; 
    Rec rec2 = {2, 1, 1}; 
    Rec rec3 = {3, 1, 1}; 
    Rec rec4 = {4, 1, 1}; 
    Rec rec5 = {4, 1, 1}; 

    std::vector<Rec> v; 
    v.push_back(rec1); 
    v.push_back(rec2); 
    v.push_back(rec3); 
    v.push_back(rec4); 
    v.push_back(rec5); 

    std::copy(v.begin(), v.end(), std::ostream_iterator<Rec>(std::cout, ",\n")); 

    return 1; 
} 
+0

http://en.cppreference.com/w/cpp/it erator/ostream_iterator/operator%3D –

0

正如莫希特提到你必須重載< <爲您的自定義結構,因爲只有你知道什麼是在你的結構,所以你有責任在打印

struct Rec 
{ 
int name; 
int number; 
int result; 
friend ostream& operator<<(ostream& os, const Rec& rec); // Here is the overloaded << operator 
}; 
ostream& operator<<(ostream& os, const Rec& rec) 
{ 
    os<<"[" << rec.name<< '/' << rec.number<< '/' << rec.result<<"] \n"; 
} 
int main() 
{ 

    Rec rec1 = {1,1,1}; 

    Rec rec2 = {2,1,1};Rec rec3 = {3,1,1};Rec rec4 = {4,1,1};Rec rec5 = {4,1,1}; 
    std::vector<Rec> record; 
    record.push_back(rec1); 
    record.push_back(rec2); 
    record.push_back(rec3); 
    record.push_back(rec4); 
    record.push_back(rec5); 
    std::copy(record.begin(),record.end(),std::ostream_iterator<Rec>(std::cout,"")); // Now no problem here 
    return 1; 
} 
相關問題