将字符串存储在无符号长整型的向量中
Store a string in a vector of unsigned long int
我想将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);
}
输出
相关文章:
- C 字符串返回字符串的整数/双精度/长整型值
- 无法在 Arduino 中uint8_t数组转换为无符号长整型数组
- JNI 日期值转换问题,在C++中获取不同的长整型值
- 将长整型值打印为带有前导零的十六进制
- 为什么在传递长整型时调用具有两个双精度类型的参数的重载函数?
- 提升不良词法强制转换:将字符串转换为无符号长整型时,无法将源类型值解释为目标
- 将最小值整数转换为无符号长整型
- 如何将小端格式的QByteArray转换为无符号长整型
- 无符号长整型和无符号 int 之间有什么区别,这 2 种类型应该如何在 c# 中封送?
- 环礁和(长整型)的区别?
- 将逗号格式化为长整型整数
- 如何将长整型传递给 itoa 函数?
- 是否存在将长整型转换为指针有效的情况
- 在 C++ 中创建一对长整型和矢量时出现编译错误
- 当我使用长整型时,我的代码不起作用,它与 int 一起工作得很好
- 将字符串中以十六进制形式存储的负长整型值转换为 C++ 中的长整型变量
- 为什么当我们把变量"u"的数据类型从长整型更改为整型时,模幂会出错?
- 错误:请求从 std::chrono::time_point 浮点数转换为非标量类型长整型
- 使用累加对包含长整型的向量求和
- 将字符串存储在无符号长整型的向量中