from *int to string without loop

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 ?"

2
ss << tab[0] << tab[1] << tab[2] << tab[3];
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.

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

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

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