我有一个类成员变量为const std::vectorstd::string类型,因为是const,所以只能在初始化列表中进行赋值,其中的string值不是可见的ASCII字符,需要通过16进制字节数组的方法来构造string,我的写法如下:
class TestVector {
public:
TestVector();
void print() {
std::cout << mv[0] << std::endl;
for (auto& v : mv) {
for (auto& c : v) {
std::cout << std::hex << std::setw(2) << std::setfill('0') << int(c)<<" ";
}
std::cout << std::endl;
}
}
private:
const std::vector<std::string> mv;
};
TestVector::TestVector()
:mv({
std::string("123"),//这句打印正常
std::string({0xAA, 0x38}, 2)//这句为空
})
{
}
编译没有异常,可运行时为什么mv[1]为空?正确的写法是什么?求指教,谢谢
你这是什么意思?用string存储数值?嵌套的vector不行吗
我不知道std::string(std::initializer_list<char>,size_t)
这个重载函数的作用,但我知道std::string(std::initializer_list<char>)
才是用来用初始化列表构造一个string对象的。修改后的代码如下:
#include<iostream>
#include<iomanip>
#include<vector>
class TestVector {
public:
TestVector();
void print() {
for (auto& v : mv) {
for (auto& c : v) {
std::cout << std::hex << std::setw(2) << std::setfill('0') << int(c) << " ";
}
std::cout << std::endl;
}
}
private:
const std::vector<std::string> mv;
};
TestVector::TestVector()
:mv({
std::string("123"),//这句打印正常
std::string({(char)0xAA, (char)0x38})//这句为空
})
{
}
int main()
{
TestVector v;
v.print();
return 0;
}
std::string({0xAA, 0x00, 0x38}, 3);
本以为string通过char数组构造时需要指定长度,以免数组在0x00处截断,试了下,上边那种写法不需要指定后边3这个参数,去掉就正常了
你可以用char类型的初始化列表,或字符串里用转义符
#include <iostream>
#include <string>
#include <vector>
#include <iomanip>
class TestVector
{
public:
TestVector();
void print()
{
std::cout << std::uppercase << std::hex;
for (auto &v : mv)
{
for (auto &c : v)
std::cout << std::setw(2) << std::setfill('0') << (c & 0xFF) << " ";
std::cout << std::endl;
}
}
private:
const std::vector<std::string> mv;
};
TestVector::TestVector()
: mv({std::string("123"),
std::string({(char)0xAA, (char)0x38}),
std::string("\xAA\x38")})
{
}
int main()
{
TestVector t;
t.print();
}