以相反的顺序推入向量

时间:2013-10-21 13:11:29

标签: c++ stl

如何将char[]数组中的字节按相反的顺序推送到std::vector<char>?例如我想推

char c[] = "a string";

std::vector<char> v;

这样最终v将包含

{'g','n','i','r','t','s',' ','a'}

5 个答案:

答案 0 :(得分:9)

std::string cString(c);
std::vector<char> v(cString.rbegin(), cString.rend());

v.insert(v.end(), cString.rbegin(), cString.rend());

现有的矢量。

答案 1 :(得分:4)

使用反向迭代器:

typedef std::reverse_iterator<const char*> r_it;
std::vector<char> v ( r_it(std::end(c)), r_it(std::begin(c)) );

在C ++ 14中,我们将能够做到

std::vector<char> v( std::crbegin(c), std::crend(c) );

要附加到现有矢量,请使用

v.insert( v.end(), rbegin, rend );

答案 2 :(得分:4)

如果不想使用std :: string(避免分配等),可以明确使用reverse_iterator。我使用辅助函数,因为我讨厌明确指定模板参数:

template <class It>
std::reverse_iterator<It> make_reverse(It it)
{
    return std::reverse_iterator<It>(it);
}

...

char c[] = "a string";
std::vector<char> v( make_reverse(std::end(c)) + 1, make_reverse(std::begin(c)) );

+1就在那里,因为您想跳过\0的结尾c

答案 3 :(得分:1)

#include <algorithm>
#include <iterator>
[...]

char c[] = "a string";
std::vector<char> v;

std::reverse_copy(c, c + sizeof(c)/sizeof(c[0]), std::back_inserter(v));

感谢克里斯最初在评论中建议使用reverse_copy。

请注意,使用此方法,您将在向量的第一个元素中获得'\0'

答案 4 :(得分:1)

如果您想使用reverse_copy

char c[] = ...;
std::vector<char> vec;
// Avoid to copy the terminating '\0': Don't add +1 to strlen(c)
std::reverse_copy(c, c+strlen(c), std::back_inserter(vec));