簡體   English   中英

如何更改C ++ STL向量的特定元素

[英]How to change a particular element of a C++ STL vector

vector<int> l;
for(int i=1;i<=10;i++){
   l.push_back(i);
}

現在,例如, 如何將向量的5th element更改為-1

我試過l.assign(4, -1); 它的行為不符合預期。 其他矢量方法似乎都不合適。

我使用了矢量,因為我需要在我的代碼中使用隨機訪問功能(使用l.at(i) )。

atoperator[]都返回對索引元素的引用,因此您可以簡單地使用:

l.at(4) = -1;

要么

l[4] = -1;

盡管@JamesMcNellis的答案是有效的,但我想解釋一些關於錯誤處理的事情,以及還有另一種方法可以做你想做的事情。

您有四種方法可以訪問向量中的特定項:

  • 使用[]運算符
  • 使用at(...)的成員函數
  • 將迭代器與給定的偏移量結合使用
  • 使用標准C ++庫的algorithm頭中的std::for_each 這是我可以推薦的另一種方式(它在內部使用迭代器)。 您可以在此處閱讀有關它的更多信息。

在下面的例子中,我將使用以下載體作為實驗室大鼠並解釋前三種方法:

static const int arr[] = {1, 2, 3, 4};
std::vector<int> v(arr, arr+sizeof(arr)/sizeof(arr[0]));

這會創建一個向量,如下所示:

1 2 3 4

首先讓我們來看看[]的做事方式。 它的工作方式與使用普通數組時的預期方式大致相同。 您提供索引並可能訪問所需的項目。 我說可能是因為[]運算符不檢查向量是否實際上有那么多項。 這導致無聲的無效內存訪問。 例:

v[10] = 9;

這可能會也可能不會導致即時崩潰。 最糟糕的情況當然是如果它沒有,你實際上得到的似乎是一個有效的值。 與數組類似,這可能會導致浪費時間試圖找到原因,例如1000行代碼后來得到的值為100而不是234 ,這有點連接到從向量中檢索項目的位置。

更好的方法是使用at(...) 這將自動檢查out of bounds行為並中斷拋出std::out_of_range 所以在我們擁有的情況下

v.at(10) = 9;

我們將得到:

拋出'std :: out_of_range'實例后調用終止
what():vector :: _ M_range_check:__n(10)> = this-> size()(4)

第三種方式類似於[]運算符,你可以搞砸了。 像數組一樣的向量是包含相同類型數據的連續內存塊序列。 這意味着您可以通過將起始地址分配給迭代器來使用起始地址,然后只需向此迭代器添加偏移量。 偏移量僅表示要遍歷的第一個項目后的項目數:

std::vector<int>::iterator it = v.begin(); // First element of your vector
*(it+0) = 9;  // offest = 0 basically means accessing v.begin()
// Now we have 9 2 3 4 instead of 1 2 3 4
*(it+1) = -1; // offset = 1 means first item of v plus an additional one
// Now we have 9 -1 3 4 instead of 9 2 3 4
// ...

如你所見,我們也可以做到

*(it+10) = 9;

這又是一個無效的內存訪問。 這基本上與使用at(0 + offset)但沒有越界錯誤檢查相同。

我建議盡可能使用at(...)不僅因為它與迭代器訪問相比更具可讀性,而且因為我對上面提到的帶偏移組合的迭代器和[]運算符的無效索引進行了錯誤檢查。

這應該這樣做:

l[4] = -1

您可以使用下標運算符

l[4] = -1

我更喜歡

l.at(4)= -1;

而[4]是你的指數

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM