如何将 unsigned char[] 转换为 std::vector<unsigned char>
Posted
技术标签:
【中文标题】如何将 unsigned char[] 转换为 std::vector<unsigned char>【英文标题】:How to convert unsigned char[] to 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<unsigned char*>
- 注意 *
,可能你在你的一个原型中错误地写了这个 *
有一个错字:end()
缺少结尾
。
为什么不直接使用字符串呢?不就是一种矢量吗?
【参考方案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<unsigned char>
。 [over.match.list]/1:
当非聚合类类型
T
的对象被列表初始化时 8.5.4 规定重载决议是根据 根据本节中的规则,重载决议选择 构造函数分两个阶段:最初,候选函数是类
T
[..] 的初始化列表构造函数 (8.5.4) [..]如果找不到可行的初始化列表构造函数,则再次执行重载决议,其中 候选函数是类
T
的所有构造函数,参数列表由元素组成 初始化列表。
现在,是否有可行的初始化列表构造函数? [over.ics.list]:
否则,如果参数类型为
std::initializer_list<X>
并且初始化器列表的所有元素都可以隐式转换 致X
,[..]10. 除以上列举的情况外,在所有情况下,都不可能进行转换。
显然没有从unsigned char*
到unsigned char
的隐式转换,因此选择了迭代器对构造函数模板。 Demo.
【讨论】:
即使是,也行不通。std::initializer_list
很贪心。请注意,c++ 默认情况下表示所有版本。如果你想要特定版本的东西,那么他们应该添加一个标签,比如c++03。
@Rapptz 添加了标准引号和演示,以明确它的工作原理。 :)
我自己建议 std::vector<unsigned char> Raw() const std::vector<unsigned char> retval(vch, vch + size()); return retval;
使用 C++03。成本(NRVO 和 RVO 都消除了副本)保持不变,但我们不会在一条线上不必要地做两件事。但这可能是个人喜好问题。
@Yakk 你说得对。介意我将其纳入我的答案吗?
@Columbo 为什么我还要添加评论? :)【参考方案2】:
它可能不会直接回答答案。
但问题是当你可以使用std::string
或std::basic_string<unsigned char>
而不是std::vector时,为什么还要使用vector,像这样:
unsigned char a[]="1234";
std::basic_string<unsigned char> v=a;
【讨论】:
为什么你认为basic_string<unsigned char>
比vector
更好?以上是关于如何将 unsigned char[] 转换为 std::vector<unsigned char>的主要内容,如果未能解决你的问题,请参考以下文章
如何将 unsigned char* 转换为 unsigned long long int?
怎样把unsigned short 转换为 unsigned char
如何使用 Swig 将 unsigned char* 转换为 Python 列表?