如果您感兴趣,为什么我使用vector<wchar_t>
代替vector<array<wchar_t, n> >
:
我想将大量不同大小的wchar_t数组存储在一起 这样我可以在一些加密/压缩过程之后将其全部写入文件。
在我开始之前,我不知道有多少阵列,所以我选择使用
vector
。但是这些数组的大小不同,我希望它们存储在每个数组旁边 另外,所以我不能使用像
vector<array<wchar_t, n> >
这样的东西。
我能想到这样做的唯一方法是逐个推送每个数组中的每个wchar_t,并且我认为它效率不高,因为自己复制一个字符串总是比strcpy
慢,并且每次都是我push_back
它将检查在这种情况下不必要的容量。
有没有更好的解决方案?
我希望像push_back(array_address, n)
这样的东西。
答案 0 :(得分:0)
考虑容器src
,您的wchar_t
向量使用插入方法:
std::vector<wchar_t> dst;
dst.insert( end(dst), begin(src), end(src));
但是没有强有力的保证它会在POD类型甚至原生类型的情况下优化到普通的memcpy。
答案 1 :(得分:0)
据我所知,你需要一个wchar_ts向量的向量,但条件是wchar_ts的向量在基向量中连续存储。类似的东西:
vector<vector<wchar_t>> v = {"string""value""list"};
问题是你需要这个以获得性能(意味着你可以单独访问每个字符串,但它们在同一个空间中)或者只是需要一个连续的字符串数组来处理它?</ p>
如果是第一个那么你需要创建自己的具有这些属性的容器,如果是第二个然后只是将序列附加到向量,但是如果你想使用memxxx函数,那么你可以试试这个:
v.resize(v.size() + arr_sz);
std::copy_n(std::begin(sz), arr_sz, v.end() - arr_sz);
这是因为(至少在VC ++ 2013中)copy_n在标量类型值上使用memxxx:
template<class _InIt,
class _Diff,
class _OutIt> inline
_OutIt _Copy_n(_InIt _First, _Diff _Count,
_OutIt _Dest, _Scalar_ptr_iterator_tag)
{ // copy [_First, _First + _Count) to [_Dest, ...), pointers to scalars
_CSTD memmove(&*_Dest, &*_First,
_Count * sizeof (*_First));
return (_Dest + _Count);
}