Problem sa bibliotekom u C++

Zanima me da li je biblioteka string dozvoljena za koriscenje? Negde na forumu sam procitala da su dozvoljene sve biblioteke koje se nalaze u bits/stdc++.h medju kojima je i string biblioteka. Problem je u tome sto kada posaljem zadatak prijavljuje CE i to kada pozivam funkciju koja se nalazi u pomenutoj biblioteci. Ovo mi se desavalo vise puta i sa nekim drugim bibliotekama. Kako da resim ovaj problem?
Hvala unapred na odgovoru!

Da li mozes da postavis primer koda koji dobija CE?

Dozvoljena je, da li mozes da posaljes link zadatka i tvoj source?

Zadatak: https://petlja.org/BubbleBee/r/Problems/-12#
Kod:
#include <iostream>
#include <string>

using namespace std;

void saberi(int* veci, int br1, int* manji, int br2)
{
	
	int ceo = 0, priv;
	for (int i = 1; i <= br2; i++)
	{
		priv = veci[br1 - i];
		veci[br1 - i] = (manji[br2 - i] + priv + ceo) % 10;
		ceo = (manji[br2 - i] + priv + ceo) / 10;
	}
	int j = 1;
	while (ceo != 0)
	{
		priv = veci[br1 - br2 - j];
		veci[br1 - br2 - j] = (priv + ceo) % 10;
		ceo = (priv + ceo) / 10;
		j++;
	}
}

int main()
{
	string br1, br2;
	cin >> br1 >> br2;
	int x = br1.length() + 1, y = br2.length() + 1;
	int a[x], b[y];
	a[0] = 0;
	b[0] = 0;
	for (int i = 1; i < x; i++)
	{
		a[i] = stoi(br1.substr(i - 1, 1));
	}
	for (int i = 1; i < y; i++)
	{
		b[i] = stoi(br2.substr(i - 1, 1));
	}
	if (x > y)
	{
		saberi(a, x, b, y);
		if (a[0] != 0) cout << a[0];
		for (int i = 1; i < x; i++)
		{
			cout << a[i];
		}
	}
	else
	{
		saberi(b, y, a, x);
		if (b[0] != 0) cout << b[0];
		for (int i = 1; i < y; i++)
		{
	cout << b[i];
		}
	}
	return 0;
}

Ja koristim kompajler GCC 4.9.2 i ne prijavljuje nikakvu gresku, sve radi normalno.
Ne znam da li mi je dobar nacin razmisljanja i da li postoji bolji nacin da se resi ovaj zadatak.

CE je jer u int array pokusavas da stavis karakter.

Brojevi su celi, ne prirodni.

Ograničenja
-10^1000 <= A, B <= 10^1000

To bi ustv bio RTE a CE je izgleda to da stoi ne radi u MinGW ??? ako neko zna tacno neka odgovori

Ja sam uradio zadatak, sve radi, ali sam zaboravio da brojevi mogu biti i negativni…

Moguce da ne radi, ja sam probo u code::blocks sa minGW i izbacivalo mi je gresku da stoi nije u scope-u

Da, zaboravila sam na taj deo, sad sam prepravila da radi i za negativne.

Ali zasto ne radi stoi da li zna neko? I koju drugu funkciju bih mogla da koristim umesto te?

Postoji problem sa stoi funkcijom na MinGW-u, kao što su gore i napomenuli.

Umesto nje možeš koristiti npr. atoi, koja kao parametar prima cstring, ali se može koristiti lako i sa std::string

    string s = "537";
    int a = atoi(s.c_str());
    cout << a;

Ili, u krajnjem slučaju ako bilo koji kompajler iz bilo kog razloga negoduje, uvek možeš napisati svoju funkciju koja radi to isto, ne bi trebalo da bude teško :slight_smile:

1 Like

Ili, u krajnjem slučaju ako bilo koji kompajler iz bilo kog razloga negoduje, uvek možeš napisati svoju funkciju koja radi to isto, ne bi trebalo da bude teško :slight_smile:

Ako je već poznato kakav će biti ulaz, mogu se preskočiti neke validacije i time može ubrzati funkcija :smiley:

const int64_t ToNumber( const char* str ) {
	const uintptr_t length = std::strlen( str );
    const uint8_t start = ( str[ 0 ] == '-' ) ? 1 : 0;
    
	uint64_t total = 0;
	for( uintptr_t i = start; i < length; ++i )
		total = ( total * 10 )  + ( str[ i ] - '0' );

	return ( start == 0 ) ? total : -total;
}

Taman sam uradio benchmark pre par meseci (korišćene su QueryPerformanceFrequency, QueryPerformanceCounter funkcije; sa AVX instrukcijama u Release okruženju i /Ox optimizacijom na MSVC2017):

ToNumber took 12677.8 ms on average. (10000 iterations of 100000 entries)
ToNumberNonConst took 37442.8 ms on average. (10000 iterations of 100000 entries)
ToNumberExponentialIterative took 49032 ms on average. (10000 iterations of 100000 entries)
ToNumberExponentialRecursive took 61946.5 ms on average. (10000 iterations of 100000 entries)
atoi took 40783.2 ms on average. (10000 iterations of 100000 entries)
stol took 109384 ms on average. (10000 iterations of 100000 entries)

Interesantna je i razlika između ToNumber i ToNumberNonConst funkcija (koja je 3x sporija):

const uintptr_t ToNumberNonConst( const char* str ) {
	const uint8_t start = ( str[ 0 ] == '-' ) ? 1 : 0;

    uintptr_t total = 0;
    for( uintptr_t i = 0; i < strlen( str ); ++i )
         total = ( total * 10 )  + ( str[ i ] - '0' );

    return ( start == 0 ) ? total : -total; 
}

Na BubbleBee/Areni ne radi ni std::to_string :confused:

1 Like

Nisam siguran u tvoje dobijene rezultate (bar njihovo predstavljanje), jer piše da je i ToNumber funkcija radila 12 sekundi u proseku (pretpostavljam prosek po iteraciji od 100 000 brojeva), što mi se čini baš mnogo, pre bih čak rekao da je to ukupno vreme.

Takođe treba obratiti pažnju da ovakve optimizacije često i nisu baš bitne, i ne treba se baš uvek zbog toga zaletati da pišemo optimizovane fukncije koje ćemo pozvati svega par puta. Mnogo je bolje koristiti standardnu funkciju koja je testirana i uglavnom garantovana da tačno radi, pa ne moramo proveravati da li smo tu napravili grešku u kucanju. Ali, ako već nema standardne (ili ne radi na datom okruženju), onda možemo napisati i svoju koju ćemo upotrebiti samo u tom zadatku sa zadatim ograničenjima :slight_smile: