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

时间:2015-11-17 23:48:00

标签: c++ vector iterator

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

另外,如果我尝试在main方法中打印向量的最后一个元素,它仍会输出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

2 个答案:

答案 0 :(得分:4)

您将向量作为值传递,这意味着它已在函数中复制。如果要在函数中修改它,则需要将其作为引用(array.back() = 3 it.end() = 4 In main = 3 )或指针(func())传递,以便修改原始向量中的数据,而不是副本。

&

我建议在这里使用引用,因为您不必担心空指针或需要更改任何方法(使用指针,您需要更改&#39; * &#39; void func(vector<int>& array) // reference void func(vector<int>* array) // pointer &#39; s。

答案 1 :(得分:0)

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

<html>
  <head>
    <script type="text/javascript" src="https://www.google.com/jsapi"></script>
    <script type="text/javascript">
      google.load("visualization", "1", {packages:["corechart"]});
      google.setOnLoadCallback(drawChart);


        var grade_list = [];

        var arrayA = ['foo', 'bar']; 
        var arrayB = []; 


        var form = document.getElementById('form');
            number1 = document.getElementById('number1');
            number2 = document.getElementById('number2');
        form.onsubmit = function() {
           var variable1 = number1.value;
           var variable2 = number2.value;
        };

        arrayB[0]= variable1*0.35+variable2*0.75
        arrayB[1]=100- arrayB[0] ;

          for (var i=0; i<arrayA.length && i<arrayB.length; i++)
        grade_list[i] = [arrayA[i], arrayB[i]];



      function drawChart() {
           var data = new google.visualization.DataTable();
            data.addColumn('string', 'Pacman');
            data.addColumn('number', 'Percentage');
            data.addRows(grade_list);

        var options = {
          legend: 'yes',
          pieSliceText: 'yes',
          pieStartAngle: 135,
          tooltip: { trigger: 'none' },
          slices: {
            0: { color: 'Blue' },
            1: { color: 'Orange' }
          }
        };

        var chart = new google.visualization.PieChart(document.getElementById('pacman'));
        chart.draw(data, options);
      }


    </script>
  </head>


    <body>

<form id="form">
  <input id="number1" type="number" min="1" name="number">
  <input id="number2" type="number" min="1" name="number">
  <button>Submit</button>
</form>
        <div id="pacman" style="width: 600px; height: 400px;"></div>      
</body>
</html>​

然后输出变为:

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; } 的矢量副本,而不是原始矢量副本。