使用迭代器时,C++矢量内容未更改

C++ vector content not changed while using iterator

本文关键字:迭代器 C++      更新时间:2023-10-16

我有一个包含整数元素{1,2,3,4}的向量,我试图删除func方法中的最后一个元素。当我使用pop_back()和back()时,它工作得很好。但是当我在方法中使用迭代器时,它说最后一个元素仍然是4。

此外,如果我试图在主方法中打印回向量的最后一个元素,它仍然输出4。

有人能向我解释一下,如果我想用main以外的方法更改向量的内容,我应该怎么做吗?

我的代码:

using namespace std;
void func(vector<int> array) {
    array.pop_back();    
    cout << "array.back() = " << array.back() << endl;
    vector <int>::iterator it = array.end();
    cout << "it.end() = " << (*it) << endl;
}
int main(void) {
   vector <int>  ar;
   ar.push_back(1);
   ar.push_back(2);
   ar.push_back(3);
   ar.push_back(4);
   func(ar);
   cout << "In main = " << ar.back() << endl;
   return 0;
}

它输出:

array.back() = 3
it.end() = 4
In main = 4

您将向量作为值传递,这意味着它将被复制到函数中。如果要在函数中修改它,则需要将其作为引用(&)或指针(*)传递,以便修改原始矢量中的数据,而不是副本。

void func(vector<int>& array) // reference
void func(vector<int>* array) // pointer

我建议在这里使用引用,因为您不需要担心空指针,也不需要更改任何方法(使用指针,您需要将"."更改为"->")。

您需要将传递给func()的参数更改为通过引用,而不是像这样通过值:

#include <iostream>
#include <vector>
using namespace std;
void func(vector<int>& array) {
    array.pop_back();    
    cout << "array.back() = " << array.back() << endl;
    vector <int>::iterator it = array.end();
    cout << "it.end() = " << (*it) << endl;
}
int main(void) {
   vector <int>  ar;
   ar.push_back(1);
   ar.push_back(2);
   ar.push_back(3);
   ar.push_back(4);
   func(ar);
   cout << "In main = " << ar.back() << endl;
   return 0;
}

则输出变为:

array.back() = 3
it.end() = 4
In main = 3

否则,将修改传递给func()的矢量的副本,而不是原始矢量。