Wypisanie zawartości std::vector lub std::list bez użycia pętli

0

Tak jak w temacie mam stworzyć funkcję wypisującą zawartość listy lub vectora ale bez użycia pętli i rekurencji. Funkcja ma pobierać konkretyzację vectora lub listy oraz znak oddzielający kolejne elementy kolekcji. I w sumie nie wiem jak to zrobić. Patrzę na metody dostępne w STLu ale nic mi do głowy nie przychodzi.

0

for_each (chyba, że klasyfikujesz to jako pętlę) bądź imho najlepsze:

std::copy(vector.begin(), vector.end(), std::ostream_iterator<int>(std::cout, " "));
0

mam stworzyć funkcję wypisującą zawartość listy lub vectora ale bez użycia pętli i rekurencji.

Niewykonalne. Można użyć

for (int i=0; i<w.count(); i++) cout<<i;

albofor (auto it=w.begin(); it!=w.end(); ++it) cout<<*it;

albo<code class="cpp">for (int i : w) cout<<i;

alboint i=0;
while (i<w.count()) cout<<i++;

albo
```cpp
std::for_each(w.begin(), w.end(), [](int i){ cout<<i; });

albo jeszcze parę innych "wariacji na temat", ale wszystko jest i tak albo bezpośrednią, albo zakamuflowaną wewnątrz funkcji bibliotecznej pętlą.

0

Hmm nie wiem czy niewykonalne ale podaje cytat z zadania: "Zabronione jest używanie instrukcji pętli i rekurencji." Jest to seria zadań na jakieś tricki w C++ i STL-u.

Anyway THX za odpowiedzi.

0

Lub rozwiązanie czysto bez ukrytych pętli oraz rekurencji:

if (vector.size() == 1)
{
 cout << vector[0] << endl;
}

if (vector.size() == 2)
{
 cout << vector[0] << endl << vector[1] << endl;
}

if (vector.size() == 3)
{
 cout << vector[0] << endl << vector[1] << endl << vector[2] << endl;
}

if (vector.size() == 4)
{
 cout << vector[0] << endl << vector[1] << endl << vector[2] << endl << vector[3] << endl;
}
...

;P

0

Ewentualnie morze chodzi o instrukcję switch, idąc tropem @Patryk27, ale trochę w to wątpię:

switch(vector.size())
{
case 1: cout<<vector[0]<<endl;
case 2: cout<<vector[2]<<endl;
case 3: cout<<vector[3]<<endl;
...

}
 
0

Rzeczywiście pomyliłem się:

 switch(vector.size())
{
case 1: cout<<vector[0]<<endl;
case 2: cout<<vector[1]<<endl;
case 3: cout<<vector[2]<<endl;
...
 
}
1

goto

0

Ewentualnie morze chodzi o instrukcję switch, idąc tropem @Patryk27, ale trochę w to wątpię:

switch(vector.size())
{
case 1: cout<<vector[0]<<endl;
case 2: cout<<vector[2]<<endl;
case 3: cout<<vector[3]<<endl;
...

}

Tak to nie zadziała. Musiałoby być tak:

  int i = 0;
  switch(w.size())
  {
     case 666: cout << w[i++] << endl;
     case 665: cout << w[i++] << endl;
     ...
     case 3: cout << w[i++] << endl;
     case 2: cout << w[i++] << endl;
     case 1: cout << w[i] << endl;
  }
2

Bez iteracji i rekurencji:

 
#include <iostream>
#include <vector>

using namespace std;

template<class T>
struct Helper
{
     Helper()
     {
         cout << *current << '\n';
         current++;
     }
     static T *current;
};

template < class T > T* Helper<T>::current = nullptr;

template< class T>
void printListContent(std::vector<T> &myVector)
{
    Helper<T>::current = &myVector[0];
    delete[] new Helper<T>[myVector.size()];
}

int main()
{
    std::vector<int> myVector1 = {1, 1, 2, 3, 5, 8, 13};
    printListContent<int>(myVector1);

    std::vector<std::string> myVector2 = {"foo", "bar", "baz"};
    printListContent<std::string>(myVector2);
    return 0;
}

Pomysł zaczerpnięty z : http://stackoverflow.com/questions/4568645/printing-1-to-1000-without-loop-or-conditionals
Polecam link, nigdzie indziej nie widziałem takiego stężenia haków na język jak tam :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1