2012-02-16 1 views
2

Je dois enregistrer un ID croissant en tant que clé dans une base de données levelDB. Donc ce que je reçois (et ce que j'ai à donner à levelDB) est une chaîne.augmenter le nombre dans la chaîne

Question: Existe-t-il un moyen élégant d'augmenter un nombre enregistré dans une chaîne?

Exemple:

std::string key = "123"; 
[..fancy code snipped to increase key by 1..] 
std::cout << key << std::endl; // yields 124 

Cheers! PS: préférerait rester avec la compilation standard, c'est-à-dire sans C++ 11.

+0

êtes-vous que la valeur n'est pas 124? –

+0

@izomorphius: typo .. merci ... c'est de 123 à 124 – ezdazuzena

+0

Donc, votre clé est en fait 123, pas votre valeur? Qu'est-ce qui se passe avec votre ancienne clé? – Kiril

Répondre

3
#include <sstream> 
std::string key = "123"; 
std::istringstream in(key); 
int int_key; 
in >> int_key; 
int_key++; 
std::ostringstream out; 
out << int_key; 
key = out.str(); 
std::cout << key << std::endl; 

Vous pouvez aussi le faire en utilisant la coulée de style c:

std::string key = "123"; 
int int_key = atoi(key.c_str()); 
int_key++; 
char key_char[20]; 
itoa(int_key, key_char, 10); 
key = key_char; 
cout << key << endl; 
+0

pourrait-il être que ce n'est pas le standard C++ .. on dirait qu'il n'est pas supporté par g ++ – ezdazuzena

+0

hmmm Je suis sûr à 99% qu'il est supporté par g ++. Essayez d'inclure cstdlib –

+0

non .. ne fonctionne pas – ezdazuzena

1

Peut-être quelque chose comme ceci:

std::string key = "123"; 
std::stringstream out; 
out << (atoi(key.c_str()) + 1); 
key = out.str(); 
0

code:

istringstream iss(key); 
int ikey; 
iss >> ikey; 
ostringstream oss; 
oss << (ikey+1); 
key = oss.str(); 
2

Vous pouvez toujours écrire une petite routine pour faire la base 10 arithmétique, mais la solution la plus simple est généralement de maintenir le nombre comme int (ou un autre type intégral), et convertissez cela en une chaîne si nécessaire.

0

Ah, il est vrai que LevelDB ne prend dans les chaînes et il peut retourner une chaîne, mais la structure Slice a également constructeur avec un tableau de données opaque:

// Create a slice that refers to data[0,n-1]. 
Slice(const char* data, size_t n) 

Lorsque vous obtenez une Slice clé que vous avez encore un char* que les données, de sorte que vous n'avez pas vraiment à se soucier des cordes:

// Return a pointer to the beginning of the referenced data 
const char* data() const { return data_; } 

Si votre objectif ensemble est d'avoir un entier comme la clé, puis il suffit de convertir votre entier à un char * et magasin dans leveldb, comme ceci:

int oldKey = 123; 
char key[8]; 
memset(key, 0, 8); 

*(int*)(&key) = oldKey; 
*(int*)(&key) += 1; 

// key is now 124 

// want to put it back in a slice? 
Slice s(key, sizeof(int)); 

pas besoin de chaînes embêtants et coûteuses ...

+0

erreur: cast de 'char *' à 'int' perd la précision :((dans 'key = (char *) (((int) touche) +1);') – ezdazuzena

+0

@ezdazuzena Je ne suis pas obtenir l'erreur, voici une version compilée gcc-4.3.4: http://ideone.com/W3NQ2 J'ai également compilé le même code dans VS 2010 (plates-formes 32 bits et 64 bits). – Kiril

+0

gcc version 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4) – ezdazuzena