【问题标题】:Initialization of std::string from std::vector<unsigned char> causes error从 std::vector<unsigned char> 初始化 std::string 会导致错误
【发布时间】:2018-04-10 17:58:08
【问题描述】:

在 C++ 中,我们可以通过
std::vector&lt;unsigned char&gt; tmp_1 { &amp;some_vector[i] , &amp;some_vector[j] }; 从另一个向量创建一个向量

问题:有没有办法为std::string做同样的事情?
比如:

std::string tmp2 { &some_vector[i] , &some_vector[j] };

尝试使用文档中的构造函数总是返回错误;

注意: *some_vector 是无符号字符的向量

UPD:找到答案:有错字,因此尝试访问 [-1] 元素。

【问题讨论】:

  • 查看文档或代码,了解是否有适合您需求的构造函数重载。
  • 尝试前不要问...
  • 已尝试 - 在 xstring 中读取访问冲突

标签: c++ vector stdstring


【解决方案1】:

std::string 有several constructors,其中一些可用于从std::vector 构造字符串,例如:

// using a char* pointer and a size...
std::string tmp2( reinterpret_cast<char*>(&some_vector[i]), j-i );

// using char* pointers as iterators...
std::string tmp2( &some_vector[i], &some_vector[j] );

// using vector iterators...
std::string tmp2( some_vector.begin()+i, some_vector.begin()+j );

Live Demo

【讨论】:

    【解决方案2】:

    这个:

    std::string tmp2 { &some_vector[i] , &some_vector[j] };
    

    应该适用于std::vector,但我更喜欢更具可读性和更安全的解决方案:

    std::string tmp2 { std::next( some_container, i ) , std::next( some_container.begin(), j ) };
    

    它应该适用于任何类型的容器,可以转换为char。例如,如果您或其他人后来出于某种原因决定将std::vector&lt;char&gt; 替换为std::deque&lt;char&gt;,那么您的程序将突然变得更危险,而更危险的事情却悄悄地开始变得无法预测&amp;container[i]。

    【讨论】:

      猜你喜欢
      • 2012-03-07
      • 2018-12-02
      • 2012-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-11
      相关资源
      最近更新 更多