元素已正确插入,但打印少了一个元素

问题描述 投票:0回答:1
#include <iostream>
#include <vector>
using namespace std;

void insert(vector<int> &vec, int newEle)
{
    int i = vec.size() - 1;

    while (vec[i] > newEle)
    {
        cout << vec[i] << endl;
        vec[i + 1] = vec[i];
        i--;
    }
    vec[i + 1] = newEle;
}

void display(vector<int> &vec)
{
    for (int i = 0; i < vec.size(); i++)
    {
        cout << vec[i] << " ";
    }
}

int main()
{
    vector<int> vect{4, 8, 13, 16, 20, 25, 28, 33};
    insert(vect, 18);
    display(vect);
    // cout << endl;
    // insert(vect, 11);
    // display(vect);
    return 0;
}

元素已正确插入,但打印的元素少了一个。

输出是 4 8 13 16 18 20 25 28,缺少 33

任何人都可以帮忙做什么吗?我被困住了

c++ vector rcpp
1个回答
0
投票

在第一次迭代中,

i
等于
vec.size() - 1
。那么您就不能执行
vec[i + 1] = vec[i]
,因为您本质上是在访问
vec[vec.size()]
,这是越界的,因此是未定义的行为。

此外,在第二次迭代中,

i
等于
vec.size() - 2
。然后你就在做
vec[i + 1] = vec[i]
,相当于
vec[vec.size() - 1] = vec[vec.size() - 2]
。您正在丢弃
vec
的最后一个元素,因为您正在用
vec[vec.size() - 2]
的值覆盖它,因此您将丢失最后一个值。

更一般地说,

operator[]
不会更改向量的大小,因此您尝试插入一个值而不增加向量的大小来存储额外的值。这不行。

您可以使用

vector::insert
修复此问题:

while (vec[i] > newEle)
{
   cout << vec[i] << endl;
   i--;
}
vec.insert(vec.begin() + i + 1, newEle);

更多关于

vector::insert
https://en.cppreference.com/w/cpp/container/vector/insert

© www.soinside.com 2019 - 2024. All rights reserved.