from *int to string without loop

Odpowiedz Nowy wątek
2014-07-10 13:46

Rejestracja: 7 lat temu

Ostatnio: 4 lata temu

0

Mam zmienną typu stringstream, chciałbym wpakować do niej całą tablicę intów bez pomocy pętli. Czy to możliwe?
Przykład:

int tab[] = {5,6,2,3};
stringstream ss;

Da się do strumienia wpakować całą tablice, bez użycia pętli ?"

Bez uzycia iteracji sie nie da. A czy to bedzie wykonane niejawnie przez uzycie metody, przez copy-paste kompilatora czy przez ukrycie tego w rekurencyjna implementacje to bez roznicy. - n0name_l 2014-07-11 21:59

Pozostało 580 znaków

Rev
2014-07-10 13:50
Rev
Moderator

Rejestracja: 12 lat temu

Ostatnio: 3 dni temu

2
ss << tab[0] << tab[1] << tab[2] << tab[3];

Nie, nie, nie - to jest dział z C++, musi być jakieś rozwiązanie z szablonami, masą UB i dziwnymi przełącznikami kompilatora. Inaczej to nie ma sensu :< - Patryk27 2014-07-10 14:28
a gdyby było 100000 elementów? - Ilidan18 2014-07-10 14:44
A to wypisujesz tę konstrukcję 100000 razy. ALBO KORZYSTASZ Z PĘTLI! - Rev 2014-07-10 14:52
Jasno i dobitnie, dzięki :D - Ilidan18 2014-07-10 14:55

Pozostało 580 znaków

2014-07-10 15:03

Rejestracja: 10 lat temu

Ostatnio: 3 lata temu

Lokalizacja: Przedmonitorze Górne

4

Dlaczego nie lubisz pętli?

  int idx = 0;
  to_nie_petla:
  if(idx < 4)
  {
     ss<<tab[idx];
     ++idx;
     goto to_nie_petla;
  }

A bardziej na poważnie to:

#include <iostream>
#include <sstream>
#include <algorithm>
#include <iterator>

int main() {
    std::stringstream ss;
    int tab[] = {1, 2, 3, 4};
    std::copy(tab, tab + 4, std::ostream_iterator<int>(ss));
    return 0;
}

Ale i tak pod tym kodem kryje się pętla.


I fart u die.
edytowany 1x, ostatnio: mychal, 2014-07-10 15:05

Pozostało 580 znaków

2014-07-10 15:56

Rejestracja: 10 lat temu

Ostatnio: 1 dzień temu

Lokalizacja: Redmond, WA

1

Swoją drogą, to proponuje wrzucać też jakiś separator między te liczby, bo póki co torównie dobrze możesz napisać:

ss << "5623";

░█░█░█░█░█░█░█░█░█░█░█░
std::ostream_iterator&lt;int&gt;(ss,&quot;, &quot;) - MarekR22 2014-07-10 16:09

Pozostało 580 znaków

Rev
2014-07-10 17:41
Rev
Moderator

Rejestracja: 12 lat temu

Ostatnio: 3 dni temu

14

@Patryk27, no sam chciałeś :P.

#include <iostream>
#include <sstream>

template <typename T, size_t Count>
struct hokus
{
    static void pokus(std::stringstream& sstream, T* arr)
    {
        sstream << arr[0];

        hokus<T, Count - 1>::pokus(sstream, arr + 1);
    }
};

template <typename T>
struct hokus<T, 0>
{
    static void pokus(std::stringstream& sstream, T* arr) {}
};

template <typename T, size_t Count>
void magic(std::stringstream& sstream, T(&arr)[Count])
{
    hokus<T, Count>::pokus(sstream, arr);
}

int main()
{
    int arr[] = { 1, 2, 3, 4, 5 };
    std::stringstream sstream;

    magic(sstream, arr);

    std::cout << sstream.str() << "\n";
}

Żadnych pętli.
cafa184b65.png


No, nareszcie jakieś porządne rozwiązanie :D - Patryk27 2014-07-10 17:46
@Rev nie lubie cie :P Sam właśnie takiego cudaka pisałem (bo w pracy nie miałem pod ręką niczego do C++ a na ideone źle się pisze) i mnie ubiegłeś :( - Shalom 2014-07-10 18:16
@Shalom, ideone na 100% miałeś ;P - _13th_Dragon 2014-07-10 22:32
Przecież napisałem że na IDEOne się słabo klepie :P - Shalom 2014-07-10 23:47

Pozostało 580 znaków

2014-07-10 22:31

Rejestracja: 14 lat temu

Ostatnio: 1 dzień temu

2
#include <iostream> 
#include <sstream> 
#include <iterator>
#include <algorithm>

int main ()
  {
   int tab[]={5,6,2,3};
   std::stringstream ss;
   std::ostream_iterator<int> sss(ss,", ");
   std::copy(tab,tab+sizeof(tab)/sizeof(*tab),sss);
   return 0;
  }
#include <iostream> 
#include <sstream> 

void cpy(std::stringstream &ss,int *tab,int *end)
  {
   if(tab<end)
     {
      ss<<*tab<<", ";
      cpy(ss,tab+1,end);
     }
  }

int main ()
  {
   int tab[]={5,6,2,3};
   std::stringstream ss;
   cpy(ss,tab,tab+sizeof(tab)/sizeof(*tab));
   return 0;
  }

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2014-07-11 19:40

Rejestracja: 5 lat temu

Ostatnio: 1 tydzień temu

Lokalizacja: Szczecin

0
#include <iostream>
#include <sstream>

template<typename T>
void call(T& array, std::ostream& o)
{
    static auto it = std::begin(array);
    if(it != std::end(array)) {
        o << *it;
        ++it;
        call(array, o);
    }
}

int main()
{
    std::stringstream s;
    int a[] = { 1, 2, 3, 4, 5, 6 };
    call(a, s);
    std::cout << s.str();

    return 0;
}

http://ideone.com/FruB67

win

edytowany 3x, ostatnio: gośćabc, 2014-07-11 19:43
Pokaż pozostałe 10 komentarzy
No jasne, rozumiem że wg ciebie w tym przypadku void test(int arr[]) - std::end(arr) zadziała i zwróci poprawną wartość? - _13th_Dragon 2014-07-11 22:10
No i co to za argument przeciw sizeof? Kazdy nowicjusz wie, ze tablica i wskaznik to 2 rozne rzeczy, a kazdy 4-latek wie, ze 2 rozne rzeczy na ogol maja 2 rozne rozmiary... - n0name_l 2014-07-11 22:11
no wiesz, niby młodzi a Ty stary i nie umiesz zera od "o" odróżnić (taki żarcik); jak powiedziałem nie gadam na ten temat; ten link był rzucony randomowo żebyście się czymś zajęli; - gośćabc 2014-07-11 22:19
żeby było jasne, ja tu jestem ostatni żeby kłamać na własną korzyść dlatego przyznam, że może lekko pochopny byłem w swoich osądach: http://i.imgur.com/hqCNex4.png do jutra - gośćabc 2014-07-11 22:25

Pozostało 580 znaków

Odpowiedz

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