» »

Šablona obrni string

Šablona obrni string

abcd123 ::

Pozdravljeni,

imam eno vprašanje glede šablon.

rad bi napisal program v C++, kateri bi obrnil števila in besede.
Primer:
C++ se spremeni v ++C
123 se spremeni v 321

V glavnem programu sem se tega lotil na naslednji način:
char myStr[] = "ales";
   int dolzina = strlen(myStr);
   
    for(int i=dolzina;i>=0;i--)
    {
            cout<<myStr[i];     
    }


Nikakor mi pa ne uspe to narediti s pomočjo šablone. Lepo bi prosil za kakše nasvete.
Najlepša hvala

mallard ::

V standardni knjižnici imaš funkcijo reverse:

#include <algorithm>

char myStr = "ales";
std::reverse(myStr, myStr + strlen(myStr));

std::string str = "ales";
std::reverse(str.begin(), str.end());


Za obračanje števil se pa malo poigraj z deljenjem, množenjem, ostankom deljenja, itd. Napiši običajno funkcijo, npr. za int, potem pa enostavno spremeni v šablono tako da imena tipov zamenjaš s šablonskim parametrom.

Zgodovina sprememb…

  • spremenilo: mallard ()

abcd123 ::

sedaj sem napisal program in mi do neke mere deluje, ampak še vedno ne tako kot hočem.

template<typename T>
double menjaj(T& a)
{    
    char myStr[] = "test";
    std::reverse(myStr, myStr + strlen(myStr));
    cout<<myStr;
}

 
 int main()
 {
  

     char a[] = {"abcd"};


Zanima me kako naj naredim, da mi bo šablona vzela ven char a[] iz glavnega programa.
Sedaj sem naredil začasno char myStr[] = "test";, ampak namesto te besede bi rad, da mi obrne besedo abcd iz glavnega programa.


Najlepša hvala za odgovore

abcd123 ::

Mi je uspelo.

Naredil sem pa tako:

template<typename T>
double menjaj(T& a)
{     
    std::string str = a;
    std::string rstr = str;
    std::reverse(rstr.begin(), rstr.end());
    std::cout << rstr << std::endl;
}

 
 int main()
 {
       char a[] = {"ales"};

Mavrik ::

Tole nekak uniči cel point uporabe templatov. Kaj si hotel s tem doseči?
The truth is rarely pure and never simple.

abcd123 ::

zakaj bi pa uničil point templatov?

mallard ::

Joj, kje začeti? Seveda ti ne obrne niza v main-u, če pa obračaš lokalni niz v funkciji.
Poglejva tvojo šablono. Kot prvo vrača double, kar nima veliko smisla za funkcijo ki obrača nize, se ti ne zdi? Drugič, če funkcija vrača neko vrednost, potem mora nekje imeti return, v nasprotnem primeru imaš program, ki nima definiranega obnašanja.

Parameter a si deklariral kot referenco na nek tip T. Torej ga lahko podaš std::reverse in ti bo lepo obrnilo niz, ki ga je klicatelj podal funkciji menjaj. Torej nekako takole:
template<typename T>
void menjaj(T& a)
{
    std::reverse(a, a + strlen(a));
    std::cout<<a << '\n';
}

 int main()
 {
     char a[] = "abcd";
     menjaj(a);
     std::cout << a;
 }


Drug problem je uporaba strlen. Ker ji moraš podat parameter tipa const char*, je posledično tvoja šablona omejena le na ta tip.

     int a[] = {1,2,3};
     menjaj(a);  // error: cannot conver int* to const char*


Edit: vidim, da si že nekaj pogruntal :) The point still stands.

Zgodovina sprememb…

  • spremenilo: mallard ()

folfy ::

Edit: mallard me je prehitev :)

Zgodovina sprememb…

  • spremenilo: folfy ()

abcd123 ::

mallard: vem da sem obračal lokalni niz v funkciji. To sem naredil samo zato, da sem testiral če mi ta funkcija sploh pravilno obrača niz. Sicer sem imel na ta način kot si napisal že narejeno, ampak mi nikakor ni uspelo naredit delujoče funkcije. Zdaj mi vse deluje pravilno.
Kako pa naj naredim potem brez uporabe strlen?

Torej je spodnji način boljši?

std::string str = a;
    std::string rstr = str;
    std::reverse(rstr.begin(), rstr.end());
    std::cout << rstr << std::endl;



V mojem primeru sem hotel narediti še eno šablono, ki bi bila primerna tudi za menjavo tipa int. Tako, da bi imel 2 šabloni in bi lahko menjal zaporedje besed in številk.

Je to pravilen pristop?
Hvala

black ice ::

Naredi šablono in potem jo specializiraj še za string.

mallard ::

Nizi in cela števila so hruške in jabolka. Težko boš imel isto šablono za obračat oboje. Lahko pa narediš eno šablono za obračanje kontejnerjev (reinventing the wheel, glede na to da že imamo std::reverse) in eno za obračanje integralnih tipov.

Zgodovina sprememb…

  • spremenilo: mallard ()

abcd123 ::

sem naredil še eno šablono in vse deluje super.
menjavo števil sem naredil z množenjem,deljenjem in ostankom celoštevilčnega deljenja.

Najlepša hvala vsem za nasvete.

lp

Zgodovina sprememb…

  • spremenilo: abcd123 ()

Tutankhamun ::

#include <string>
#include <iostream>
#include <sstream>
#include <algorithm>

template <typename T>
void reverse(T &val)
{
	std::string _val;
	std::stringstream ss;

	ss << val;
	_val = ss.str();

	std::reverse(_val.begin(), _val.end());

	ss.str("");
	ss << _val;
	ss >> val;
}

template <>
void reverse <std::string> (std::string &val)
{
	std::reverse(val.begin(), val.end());
}

int main(int argc, char *argv[])
{
	std::string str = "abcdefgh";

	std::cout << "before: " << str << std::endl;
	reverse(str);
	std::cout << "after: " << str << std::endl;

	char ch[] = "tutankhamun";

	std::cout << "before: " << ch << std::endl;
	reverse(ch);
	std::cout << "after: " << ch << std::endl;


	int val = 123456;

	std::cout << "before: " << val << std::endl;
	reverse(val);
	std::cout << "after: " << val << std::endl;

	return 0;
}


before: abcdefgh
after: hgfedcba
before: tutankhamun
after: numahknatut
before: 123456
after: 654321
AMD Phenom QUAD 9950 Black Edition, 8GB

Zgodovina sprememb…

MrBrdo ::

Fensi sam pretvarjanje inta v string in nazaj samo zato da lahko števke obrneš ni lih performančno najbolj ugodno. Tko čist iz vidika enostavnosti kode je pa cool.
MrBrdo


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[C++] charset-a

Oddelek: Programiranje
7816 (673) SasoS
»

[C] struct in int[] (strani: 1 2 )

Oddelek: Programiranje
656815 (5888) MrBrdo
»

Težava pri vnosu decimalnega števila v bazo (C#, Access)

Oddelek: Programiranje
12888 (605) nemonemo
»

C strukture, kazalci naloga pomoc

Oddelek: Programiranje
51385 (1280) DavidJ
»

c++ datoteke

Oddelek: Programiranje
463835 (3324) Vesoljc

Več podobnih tem