Jakiego kontenera użyć ?

0

Witam,
mam pytanko związane z kontenerami stl . Chodzi o to , że nie wiem jaki wybrać do:

Random accesu . Chodzi o to , że chce modyfikować indeks w zależności od wartości wysłanej przez pakiet.
Coś takiego :

 
bool TCharacter::BuyItem(std::vector<std::string> &packet)
{
int char_id = 0;
bool error = false;
try
{
char_id = atoi(packet[2].c_str());
}
catch(...)
{
error = true;
}

for(unsigned int i = 0; i < Map->characters.size();i++)
if(Map->character[i].char_id == char_id)
//dalszy kod


return error ? false : true;
}
2

Nie do końca się rozczytałem w tym czego potrzebujesz, więc odpowiedź jest "na oko":

Jeśli masz stałą liczbę indeksów i jest ona sensownie mała, to std::vector.
W innym wypadku, std::unordered_map (ew. std::map).
(Ew. std::set jeśli potrzebujesz tylko informacje o tym czy coś istnieje w kontenerze).

Btw, hmm, nie za bardzo rozumiem ten try-catch tam - z tego co mi wiadomo atoi nie rzuca wyjątków. Metoda c_str też zresztą nie (wręcz przeciwnie, w C++11 jest gwarancja, że c_str nie rzuci wyjątku).

0

Mi to jakoś działa . Gdy ktoś wyśle pakiet z literą to error ustawia się na true . I wtedy wywala z serwera .

Chodzi mi o to,żeby użyć najlepszego kontenera,bo potrzebuje go,żeby trzymać w nim informacje o zalogowanych użytkownikach . Więc rozmiar tego kontenera będzie się cały czas zmieniał.A dostaje się do niego za pomocą id użytkownika wysłanego z pakietu . Ale jeśli użyje std::vector to za każdym razem trzeba po nim iterować aby dostać się indeksu który ma dane o tej postaci. Gdyby było zalogowanych powiedzmy 1000 osób to taka opcja by była raczej nieopłacalna

1

W takim wypadku tak jak pisałem - std::unordered_map lub std::map.

Mi to jakoś działa . Gdy ktoś wyśle pakiet z literą to error ustawia się na true . I wtedy wywala z serwera .

Bardzo ciekawe :)
Mógłbyś napisać z jakiego kompilator korzystasz, i z której jego wersji?

Piję do tego, że w standardzie C++ (sprawdzałem w szkicu N3690) jest takie coś:

Functions from the C standard library shall not throw exceptions(193)
193) That is, the C library functions can all be treated as if they are marked noexcept. This allows implementations to make performance optimizations based on the absence of exceptions at runtime

Z tego co pamiętam, to atoi dla nieprawidłowych ciągów powoduje UB zwraca 0 (EDIT: źle pamiętałem; UB jest przy overflow tylko), który w tym wypadku nie może być rozwiązany jako wyjątek.

Hmm, założyłem, że piszesz w Embarcadero C++Builder, ale w jego dokumentacji jest:

If the string cannot be converted to a number of the corresponding type (int), atoi returns 0.

Więc raczej nie trafiłem. Stąd pytanie o kompilator :)

0

Visual Studio 2015 RC

1

https://msdn.microsoft.com/en-us/library/yd5xkb5c.aspx

The return value is 0 for atoi and _wtoi, if the input cannot be converted to a value of that type.

Coś mi mówi, że natknąłeś się na błąd w implementacji atoi (chyba, że jeszcze coś innego się tam dzieje).
Mógłbyś napisać jaki konkretnie wyjątek jest rzucany przez atoi w przypadku błędu?

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