2017-02-08 14 views
1

Ниже приведен код, который отлично работает для печати значений типа std::stringКак использовать зЬй :: копировать для печати пользователя определенного типа

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 является однопроходный OutputIterator, что пишет последовательные объекты типа Т в объект std::basic_ostream для который был построен, используя operator<<. Дополнительная строка ограничителя записывается в выходной поток после каждой операции записи. Операция записи выполняется, когда итератору (независимо от того, имеет ли это различие или нет) . Приращение std::ostream_iterator является не-оператором.

(Подтверждено от комментариев)

Вы не перегружать operator << для пользовательской записи. Используйте следующий код для перегрузки оператора.

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

Есть ли способ распечатать записи, соответствующие шаблону, используя функцию поиска find (sentence.begin(), sentence.end(), "1"); Скажите, есть ли две записи, чье имя = 1, мне нужно распечатать все записи, соответствующие ему – user2256825

+0

Что-то вроде ниже, с == оператором перегружено для (auto it = v.begin(); it! = V.end (); ++ it) { // it = std :: find_if (v.begin(), v.end(), n); if (* it == n) std :: cout << * it; } , но iam не используется здесь, – user2256825

+0

Используйте [std :: copy_if] (http://en.cppreference.com/w/cpp/algorithm/copy) с лямбда-предикатом. –

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

Как упомянута Mohit вы должны перегрузить < < для пользовательскога структуры, потому что только вы знаете, что в вашей структуре, так что вы ответственны за печать его

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; 
}