-1

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

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

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

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

4

4 回答 4

0

请记住计数,只需在擦除后将 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;
}
于 2019-09-10T14:04:22.017 回答
0

只是为了招待您的解决方案

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);
}
于 2019-09-09T18:58:42.490 回答
0

你可以这样做

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

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

于 2019-09-09T19:03:14.133 回答
0

通过始终删除带有 的元素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());
}
于 2019-09-09T19:27:16.343 回答