【问题标题】:How to convert unsigned char[] to std::vector<unsigned char>如何将 unsigned char[] 转换为 std::vector<unsigned char>
【发布时间】:2015-01-14 20:09:23
【问题描述】:

我正在尝试将其传递给我的项目的另一个需要它是向量的部分

unsigned char vch[65];

unsigned int size() const { return GetLen(vch[0]); }
const unsigned char* begin() const { return vch; }
const unsigned char* end() const { return vch + size(); 


std::vector<unsigned char> Raw() const
{
        return (vch, vch + size());
}

我得到了错误

 could not convert '(const unsigned char*)(&((const CPubKey*)this)-
CPubKey::vch)' from 'const unsigned char*' to 'std::vector<unsigned char*>'

【问题讨论】:

  • std::vector 有一个带有一对迭代器的构造函数。用那个。你很接近。
  • 错误信息是 std::vector&lt;unsigned char*&gt; - 注意 * ,可能你在你的一个原型中错误地写了这个 *
  • 有一个错字:end() 缺少结尾}
  • 为什么不直接使用字符串呢?不就是一种矢量吗?

标签: c++


【解决方案1】:
return (vch, vch + size());

这使用逗号运算符 - 长话短说,写

return std::vector<unsigned char>(vch, vch + size());

std::vector<unsigned char> vec(vch, vch + size())
return vec;

相反。 (后者在语义上是等价的,但在可读性方面更可取) 或者使用 C++11:

return {vch, vch + size()};

这确实有效,因为带有指针的花括号初始化列表无法转换为initializer_list&lt;unsigned char&gt;。 [over.match.list]/1:

当非聚合类类型T 的对象被列表初始化时 8.5.4 规定重载决议是根据 根据本节中的规则,重载决议选择 构造函数分两个阶段:

  • 最初,候选函数是类 T [..] 的初始化列表构造函数 (8.5.4) [..]

  • 如果找不到可行的初始化列表构造函数,则再次执行重载决议,其中 候选函数是类T的所有构造函数,参数列表由元素组成 初始化列表。

现在,是否有可行的初始化列表构造函数? [over.ics.list]:

  1. 否则,如果参数类型为std::initializer_list&lt;X&gt; 并且初始化器列表的所有元素都可以隐式转换 致X,[..]

10. 除以上列举的情况外,在所有情况下,都不可能进行转换。

显然没有从unsigned char*unsigned char 的隐式转换,因此选择了迭代器对构造函数模板。 Demo.

【讨论】:

  • 即使是,也行不通。 std::initializer_list 很贪心。请注意,c++ 默认情况下表示所有版本。如果你想要特定版本的东西,那么他们应该添加一个标签,比如c++03
  • @Rapptz 添加了标准引号和演示,以明确它的工作原理。 :)
  • 我自己建议 std::vector&lt;unsigned char&gt; Raw() const {std::vector&lt;unsigned char&gt; retval(vch, vch + size()); return retval; } 使用 C++03。成本(NRVO 和 RVO 都消除了副本)保持不变,但我们不会在一条线上不必要地做两件事。但这可能是个人喜好问题。
  • @Yakk 你说得对。介意我将其纳入我的答案吗?
  • @Columbo 为什么我还要添加评论? :)
【解决方案2】:

它可能不会直接回答答案。

但问题是当你可以使用std::stringstd::basic_string&lt;unsigned char&gt;而不是std::vector时,为什么还要使用vector,像这样:

unsigned char a[]="1234";
std::basic_string<unsigned char> v=a;

【讨论】:

  • 为什么你认为basic_string&lt;unsigned char&gt;vector 更好?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-11
  • 2014-02-19
  • 1970-01-01
  • 2012-03-07
  • 2013-11-18
  • 2013-09-01
  • 1970-01-01
相关资源
最近更新 更多