4

如何将char[]数组中的 byesstd::vector<char>以相反的顺序推入?例如我想推

char c[] = "a string";

进入

std::vector<char> v;

这样最终v将包含

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

?

4

5 回答 5

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

或者

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

对于现有向量。

于 2013-10-21T13:13:35.050 回答
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 );
于 2013-10-21T13:18:07.537 回答
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

于 2013-10-21T13:19:36.843 回答
2

如果您想使用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));
于 2013-10-21T13:18:25.147 回答
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));

感谢 chris 在评论中最初建议 reverse_copy。

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

于 2013-10-21T13:17:59.897 回答