2016-01-20 6 views
-3

J'ai une liste de nombres. Je voudrais les imprimer sous la forme d'une liste de nombres séparés par des virgules, au plus 10 numéros par ligne. L'extrait de programme suivant met dans la liste des nombres séparés par des virgules, sans utiliser explicit pour la boucle pour itérer le vecteur des entiers, puis-je être capable d'imprimer 10 nombres au maximum par ligne?Impression d'une liste d'entiers comme une liste de nombres séparés par des virgules avec un maximum de 10 par ligne

std::vector<int> myvector; 
    for (int i=1; i<10; ++i) myvector.push_back(i*10); 
    stringstream ss; 
    std::copy(myvector.begin(), myvector.end(), 
     std::ostream_iterator<int>(ss, ", ")); 
    cout << "list: " << ss.str() << endl; 

La sortie apparaît comme (avec virgule supplémentaire à la fin):

list: 10, 20, 30, 40, 50, 60, 70, 80, 90, 

J'ai trouvé une solution à mon problème d'origine:

// print at most 6 per line 
    int maxperline = 6; 
    std::vector<int>::const_iterator i1,i2,i3; 
    stringstream ss; 
    ss << "list: "; 
    for (i1 = myvector.begin(), i2 = myvector.end(); i1 < i2; i1+=maxperline) { 
    i3 = min(i2, i1+maxperline); 
    std::copy(i1, i3-1, std::ostream_iterator<int>(ss, ", ")); 
    ss << *(i3-1) << '\n'; 
    } 
    cout << '\n' << ss.str() << endl; 

La sortie apparaît comme:

list: 10, 20, 30, 40, 50, 60 
70, 80, 90 

Dans cette approche, nous c Avoir une flexibilité en ayant maxperline définir comme valeur que vous désirez

+1

algorithmes de gamme à venir pourraient être . En particulier 'view :: chunk'. – Jarod42

Répondre

3

Avoir quelques count de l'article de sortie, et l'utiliser.

int count = 0; 
for (int i : myvector) { 
    if (count > 0) std::cout << ", "; 
    std::cout << i; 
    if (count % 10 == 0 && count >0) std::cout << std::endl; 
    count++; 
} 

Si vous vraiment voulez-vous utiliser <algorithm> pourrait avoir un anonyme lambda

int count; 
std::for_each(myvector.begin(), myvector.end(), 
       [&](int i) { 
        if (count > 0) 
         std::cout << ", "; 
        std::cout << i; 
        if (count % 10 == 0 && count >0) 
         std::cout << std::endl; 
        count++; 
       }); 

(nous avons évidemment besoin count et std::cout être capturé et fermé par référence dans la fermeture, d'où le [&] ....)

mais honnêtement dans ce cas particulier, il serait pédant de coder en utilisant std::for_each comme ci-dessus. L'utilisation d'une boucle simple for varie comme mon premier exemple est plus court et plus approprié.

BTW bons compilateurs optimiseurs (probablement y compris GCC récemment invoqué comme g++ -Wall -O2 -std=c++11) optimiseraient probablement la deuxième solution (en utilisant std::for_each) en quelque chose d'équivalent au premier (en utilisant for et sans allouer une fermeture).

Vous pouvez même essayer de codage ce fragment dans purement continuation-passing style (avec une suite différente quand count==0 et quand count%10==0 et autres), mais ce serait malade, illisible, et compilé moins efficace ...

+0

Cela va fonctionner, mais je cherchais une solution en utilisant std :: copy ou similaire sans utiliser pour la boucle –

+0

J'ai édité mes Qs pour ajouter mes propres ans –