代码之家  ›  专栏  ›  技术社区  ›  MiP

将非空终止向量<char>转换为字符串

  •  2
  • MiP  · 技术社区  · 8 年前

    我有一个以非空结尾的字符向量,如何构造一个新字符串并让它自动插入 \0

    std::vector<char> v;
    v.push_back('H');
    v.push_back('i');
    v.push_back('!');
    //v.push_back('\0'); <~ without using this line
    
    std::string a(v.data());
    std::string b(v.begin(), v.end()); // same meaning as b(v.data(), v.size())
    

    两者之间正确的构造函数是什么?

    3 回复  |  直到 8 年前
        1
  •  7
  •   NathanOliver    8 年前

    std::string a(v.data()); 不正确。构造函数需要指向以null结尾的字符序列的指针。不给它一个是未定义的行为。

    std::string b(v.begin(), v.end()); std::string 具有与向量相同的内容。

        2
  •  5
  •   Remy Lebeau    8 年前

    此构造函数:

    std::string a(v.data());
    

    期望参数是指向以null结尾的C样式字符串的第一个字符的指针。像 v.data()

    std::string a(v.data(), v.size());
    

    也就是说,不使用此构造函数:

    basic_string(const charT* s, const Allocator& a = Allocator());
    

    basic_string(const charT* s, size_type n, const Allocator& a = Allocator());
    

    在这种情况下,字符串将完全从 v.size() 存储在向量中的字符。

    此构造函数:

    std::string b(v.begin(), v.end()); 
    

        3
  •  1
  •   joshwilsonvu    8 年前

    你的第一次尝试将失败;string可以从以null结尾的字符数组中构造,但如果没有null字符,构造函数将继续读取向量不拥有的内存,直到找到null字节。

    推荐文章