【问题标题】:How do I delete all the even/odd indexed elements from a vector in C++?如何从 C++ 中的向量中删除所有偶数/奇数索引元素?
【发布时间】:2019-09-09 18:22:25
【问题描述】:

我是 STL 的新手,我正在尝试一个简单的程序来使用 push_back 插入元素并尝试删除甚至索引的元素。

我取了 n 个元素并将其推入向量中。但是当我删除它时,我会得到分段错误或一些不希望的输出。

  for(i=0;i<n;++i)
   {
     if(i%2==0)
       v.erase(v.begin()+i);
   }

如果我使用 n-1 而不是 n 它可以工作,但不会提供所需的输出。

【问题讨论】:

  • 当你删除一个元素时,.size() 会减少,并且后面的所有元素都会向左移动。您需要考虑到这一点。
  • 作为替代方案,您可能想看看remove_if
  • 方便的建议:erase returns an iterator to the next item in the list。如果你重写 for 循环以一直使用迭代器,这个问题就会变得容易得多。

标签: c++ c++11 vector stl erase-remove-idiom


【解决方案1】:

只是为了满足您的解决方案

void EraseEveryOdd(std::vector<int>& v) {
  if ((v.size() % 2) > 0)
    v.pop_back();

  auto size = v.size() / 2;

  for (size_t i = 0; i < size; ++i)
    v.erase(v.begin() + i);
}

void EraseEveryEven(std::vector<int>& v) {
  if ((v.size() % 2) == 0)
    v.pop_back();

  auto size = (v.size() / 2) + 1;

  for (size_t i = 1; i < size; ++i)
    v.erase(v.begin() + i);
}

【讨论】:

    【解决方案2】:

    通过始终使用 erase 删除元素,您的函数将具有 O(n²) 运行时。更好的选择是先压缩元素,然后再擦除其余元素之后的所有元素:

    #include <utility>
    #include <vector>
    
    void remove_odd_indices(std::vector<int> & inout)
    {
        auto write = inout.begin();
        auto read = inout.begin();
        for(auto n = inout.size(), i = 0 * n; i < n; ++i, ++read)
        {
            if(i % 2 == 0)
                continue;
            *write++ = std::move_if_noexcept(*read);
        }
        inout.erase(write, inout.end());
    }
    

    【讨论】:

      【解决方案3】:

      你可以这样做

      for(i=n-1;i<=0;i--)
      

      正如在 cmets 中提到的,删除向量的元素会减小向量的大小。 通过更改 for 循环条件,您将开始从向量末尾删除偶数索引。这样,改变vector的大小就不会出问题了。

      【讨论】:

      • 尽量不要。做。或者不要。没有尝试。我建议您解释并可能演示这将如何帮助提问者。
      【解决方案4】:

      记住计数,只需将 itr 初始化到正确的位置 擦除后,相同的itr指向向量中下一个未删除的元素

      vector<int> vec = { 1,2,3,4,5,6,7,8,9,10};
      
      int main()
      {
      
              auto itr=vec.begin();
      
              while( itr != vec.end() ){
                      itr++;
                      vec.erase(itr);
              }
              for(auto data : vec) cout << " " << data << " " ;
              cout << endl;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-12-21
        • 2011-01-06
        • 2017-02-06
        • 2018-05-28
        • 1970-01-01
        • 1970-01-01
        • 2021-11-24
        • 1970-01-01
        相关资源
        最近更新 更多