我想将std::string
转换为std::vector<unsigned long int>
,并能够将其撤消。目前,我这样做:
std::string str = "Hello World !";
std::vector<unsigned long int> keys;
for(unsigned long int i = 0; i < str.length();)
{
unsigned long int key = 0;
for(unsigned long int j = 0; j < sizeof(unsigned long int) && i < str.length(); ++i,++j)
{
unsigned char uchar_value = static_cast<unsigned char>(str[i]);
unsigned long int ulong_value = static_cast<unsigned long int>(uchar_value);
key |= ulong_value << (j * CHAR_BIT);
}
keys.push_back(key);
}
然后,我有一个类似的程序来扭转它。但它很难看! 有更好/更优雅的方式吗?也许直接使用memcpy
?但我不知道如何。
答案 0 :(得分:-1)
怎么样:
std::string str = "Hello World !";
std::vector<unsigned long int> keys(str.size() / sizeof(unsigned long int)+1);
std::copy(begin(str), end(str), reinterpret_cast<unsigned char*>(&(*keys.begin())));
相反:
std::string str2(keys.size()*sizeof(unsigned long int), '\0');
std::copy(reinterpret_cast<unsigned char*>(&*begin(keys)), reinterpret_cast<unsigned char*>(&*end(keys)), str2.begin());
str2.resize(str.size());
如果要以相反的顺序存储字节,可以使用反向迭代器:
std::string str = "Hello World !";
std::vector<unsigned long int> keys(str.size() / sizeof(unsigned long int)+1);
std::copy(str.rbegin(), str.rbegin, reinterpret_cast<unsigned char*>(&(*keys.begin())));
答案 1 :(得分:-2)
首先我会使用Linked List,因为插入到开头和结尾是O(1)。我不明白为什么你要将char
转换为unsigned long int
你正在进行强制转换和二进制操作时遇到问题......以下是使用{{1}进行前进和后退的代码}。
std::list
编辑:如果需要使用向量,这里使用std::string str = "Hello World";
std::list<unsigned long int> keys;
for(char x : str) {
unsigned long int c = (unsigned long int) x;
// keys.push_back(c); // forward
keys.push_front(c); // reverse
}
。所以内部循环逻辑将是相同的,只有迭代器方向会改变:
std::vector