push_back整个数组wchar_t [n]到vector <wchar_t>有效地</wchar_t>

时间:2014-03-27 11:12:21

标签: c++ arrays vector

如果您感兴趣,为什么我使用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)这样的东西。

2 个答案:

答案 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);
    }