簡體   English   中英

反向插入向量

[英]Insert into vector in reverse order

假設我有兩個大小相同的向量(父母),其中填充了一些值。 在這兩個向量中,我想創建兩個相同大小的新向量(子代)。 為此,我按照以下方案在給定的位置剪掉了父母,並填補了孩子們:

Parent 1:
{1,  2,  3,  4,  5}
      ^cut
Parent 2:
{6,  7,  8,  9,  0}
          ^cut

Child 1:
{3,  4,  5,  0,  9}
Child 2:
{2,  1,  6,  7,  8}

詳細地講 ,我在位置k切割了父級1,在位置nk切割了父級2,其中n是父級2的大小。

然后,首先將父1的第二部分填充到子1中。此后,將以相反的順序將父2的第二部分附加到子1上。 子2最初將以相反的順序填充父1的第一部分。 之后,父級2的第一部分將以向前的順序附加到子級2。

現在,將零件向前插入就不成問題了。 向后插入是我無法工作的。

/* Set iterators at the cutting position */
int cut = 2;
auto cut1 = std::begin(parent1);
auto cut2 = std::end(parent2);
std::advance(cut1, cut);
std::advance(cut2, -cut);

/* Fill child1 with second part of parent1 */
child1.insert(child1.end(), cut1, std::end(parent1));
/* Add second part of parent2 in reverse order to child1 */
// ?
/* Fill child2 with first part of parent1 in reverse order */
// ?
/* Add first part of parent2 to child2 */
child2.insert(child2.end(), std::begin(parent2), cut2);

我在看std::back_inserterstd::reverse_iterator ,但是我不確定它們如何協同工作以及最優雅的方法是什么。

我也發現了這個問題,雖然這個問題並不完全相同,但似乎都暗示着我可能必須使用簡單的for循環。 由於這兩個問題都已經過時,是否有一種很好的方法可以用標准算法實現所需的行為?

您可以使用反向迭代器遍歷父對象,例如:

#include <iostream>
#include <vector>

int main() {
  std::vector<int> parent1{1, 2, 3, 4, 5};
  std::vector<int> parent2{6, 7, 8, 9, 0};

  std::vector<int> child1;
  std::vector<int> child2;

  int cut = 2;
  {
    auto cut1 = std::begin(parent1); // set cut1 to element 1
    auto cut2 = parent2.rbegin(); // set cut2 to element 0 (reverse)
    std::advance(cut1, cut); // iterate cut1 to element 3
    std::advance(cut2, cut); // iterate cut2 to element 8 (reverse)

    child1.insert(child1.end(), cut1, std::end(parent1)); // copy elements 3, 4 ,5
    child1.insert(child1.end(), parent2.rbegin(), cut2); // copy elements 0, 9 (reverse)
  }
  {
    auto cut1 = parent1.rbegin(); // set cut1 to element 5 (reverse)
    auto cut2 = parent2.begin(); // set cut2 to element 6
    std::advance(cut1, parent1.size() - cut); // iterate cut1 to element 2 (reverse)
    std::advance(cut2, parent2.size() - cut); // iterate cut2 to element 9

    child2.insert(child2.end(), cut1, parent1.rend()); // copy elements 2, 1 (reverse)
    child2.insert(child2.end(), parent2.begin(), cut2); // copy elements 6, 7, 8
  }
  for (const auto& el : child1) {
    std::cout << el << " ";
  }
  std::cout << std::endl;
  for (const auto& el : child2) {
    std::cout << el << " ";
  }
  std::cout << std::endl;
  return 0;
}

從C ++ 14開始,您可以使用std::rbegin(parent2)代替parent2.rbegin()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM