将字符串存储在无符号长整型的向量中

Store a string in a vector of unsigned long int

本文关键字:向量 长整型 无符号 字符串 存储      更新时间:2023-10-16

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

怎么样:

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), '');
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())));  

首先,我会使用链表,因为插入到开头和结尾是 O(1)。我不明白为什么您在unsigned long int进行转换和二进制操作时会遇到问题char......这是使用 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。所以内部循环逻辑将是相同的,只是迭代器方向会改变:

// forward
for(std::string::iterator it = str.begin(); it != str.end(); ++it) {
    unsigned long int c = (unsigned long int) (*it);
    keys.push_back(c);
}
// reverse
for(std::string::reverse_iterator it = str.rbegin(); it != str.rend(); ++it) {
    unsigned long int c = (unsigned long int) (*it);
    keys.push_back(c);
}

输出