увеличить число в строке - PullRequest
2 голосов
/ 16 февраля 2012

Я должен сохранить увеличивающийся идентификатор в качестве ключа в базе данных levelDB.Итак, что я получаю (и что я должен дать levelDB) - это строку.

Вопрос : существует ли элегантный способ увеличить число, сохраняемое в строке?

Пример:

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

Приветствия!

PS: предпочел бы остаться со стандартной компиляцией, то есть без C ++ 11.

Ответы [ 5 ]

3 голосов
/ 16 февраля 2012
#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;

Вы также можете сделать это, используя кастинг в стиле 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;
2 голосов
/ 16 февраля 2012

Вы всегда можете написать небольшую подпрограмму для выполнения арифметики с основанием 10, но простейшим решением обычно является сохранение числа как int (или некоторого другого целочисленного типа) и преобразование его в строку при необходимости.

1 голос
/ 16 февраля 2012

Возможно что-то вроде этого:

std::string key = "123";
std::stringstream out;
out << (atoi(key.c_str()) + 1);
key = out.str();
0 голосов
/ 16 февраля 2012

Ах, это правда, что leveldb принимает строки и может возвращать строку, , но структура Slice также имеет конструктор с непрозрачным массивом данных:

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

Когда вы получаете ключ Slice, у вас все еще есть char* в качестве данных, так что вам не нужно беспокоиться о строках:

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

Если ваша цель - иметьцелое число в качестве ключа, затем просто преобразуйте ваше целое число в символ * и сохраните его в leveldb, например, так:

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

Нет необходимости в надоедливых и дорогих строках ...

0 голосов
/ 16 февраля 2012

Код:

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