C++中如何在构造函数的初始化列表中用16进制字节数组对const std::vector<std::string>进行初始化?

我有一个类成员变量为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();
}