在没有for循环的情况下,在C++ 98/03中以相反的顺序将C数组附加到向量

Olu*_*ide 18 c++ vector

将C数组附加到向量(在C++ 98/03中)非常简单,如下所示:

std::vector<int> vec;
const int array[5] = { 1 , 2 , 3 , 4 , 5};

vec.insert( vec.end() , array , array + 5 );
Run Code Online (Sandbox Code Playgroud)

有没有办法在C++ 98/03中以相反的顺序将数组附加到向量而无需编写for循环.(这里看着你肖恩父母.)

The*_*ist 22

你去吧 使用std::reverse_copystd::back_inserter添加元素的矢量:

std::vector<int> vec;
int array[5] = { 1 , 2 , 3 , 4 , 5};

std::reverse_copy(array , array + 5, std::back_inserter(vec));
Run Code Online (Sandbox Code Playgroud)

如果您担心性能,请不要忘记reserve()在复制之前.

  • @KABoissonneault如何在复制前调用[`vec.reserve()`](http://en.cppreference.com/w/cpp/container/vector/reserve)? (3认同)

BoB*_*ish 16

vec.insert(std::end(vec),
           std::rbegin(array),
           std::rend(array));
Run Code Online (Sandbox Code Playgroud)

请注意,这使用的是C++ 14,但反向迭代器的使用时间要长得多,如果坚持使用较旧的标准,则只需手动创建它们:

int const a1[] = {1, 2, 3, 4, 5};
int a2[5];
std::copy(std::reverse_iterator<int const*>(std::end(a1)),
          std::reverse_iterator<int const*>(std::begin(a1)),
          std::begin(a2)); // copy in reverse

std::copy(std::begin(a2),
          std::end(a2),
          std::ostream_iterator<int>(std::cout, " ")); // prints "5 4 3 2 1 "
Run Code Online (Sandbox Code Playgroud)

  • 重要的是要注意,在所选答案中使用单范围插入通常比`std :: back_inserter`更有效. (4认同)
  • 并且`std :: begin`也不是C++ 03. (2认同)