我必须将增加的ID作为密钥保存到levelDB数据库中。所以我得到的(以及我必须给予levelDB的是)一个字符串。
问题:是否有一种优雅的方式来增加字符串中保存的数字?
示例:
std::string key = "123";
[..fancy code snipped to increase key by 1..]
std::cout << key << std::endl; // yields 124
干杯!
PS:更愿意继续使用标准编译,即没有C ++ 11。
答案 0 :(得分: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;
您也可以使用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;
答案 1 :(得分:2)
您总是可以编写一个小例程来执行基数10算术,但最简单的解决方案通常是将数字保持为int
(或其他一些整数类型),并根据需要将其转换为字符串。
答案 2 :(得分:1)
也许是这样的:
std::string key = "123";
std::stringstream out;
out << (atoi(key.c_str()) + 1);
key = out.str();
答案 3 :(得分:0)
代码:
istringstream iss(key);
int ikey;
iss >> ikey;
ostringstream oss;
oss << (ikey+1);
key = oss.str();
答案 4 :(得分:0)
啊,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_; }
如果您的整个目标是使用整数作为键,那么只需将整数转换为char *并将其存储在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));
不需要烦人而昂贵的琴弦......