将字符串存储在unsigned long int的向量中

时间:2015-04-25 08:29:41

标签: c++

我想将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?但我不知道如何。

2 个答案:

答案 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

Output

编辑:如果需要使用向量,这里使用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

Output