簡體   English   中英

如何迭代向量

[英]How do I iterate vector

我有這樣的代碼

#include <iostream>
#include <vector>
#include <string>

using namespace std;

void removeFirstFromVec(vector<int> & vecLink) {
    // remore first element from some vector
    vecLink.erase(vecLink.begin() + 0);
}

int main()
{
    vector<int> myVec;
    myVec.push_back(1);
    myVec.push_back(2);
    myVec.push_back(3);
    cout << "Before removal\n";
    for (auto & i : myVec) {
        cout << myVec[i-1] << endl;
    }
    removeFirstFromVec(myVec);
    cout << "After removal\n";
    for (auto & i : myVec) { // starts with 2
        cout << myVec[i-1] << endl;
    }
    return 0;
}

但是在我發表評論的地方,它以 2 而不是 0 開頭,這會導致錯誤。 我做錯了什么,或者有沒有辦法使用類似auto & i: myVec而不是for (int i = 0; i <...size(); i++)之類的簡短內容而不會出現此類錯誤

在基於范圍的 for 循環中

for (auto & i : myVec) {
    cout << myVec[i-1] << endl;
}

i是向量的元素,而不是索引。 它應該是

for (auto & i : myVec) {
    cout << i << endl;
}

迭代返回項目本身,而不是索引。

vector<int> vec { 5, 3, 2 };
for (int i: vec) {
  cout << i << endl;
}

請問output這個:

5
3
2

如果您執行以下操作:

  1. 使用模板函數接受向量的任何類型。

  2. 使用直接初始化方法而不是push_back()以避免大量行。

  3. 單一語法的大括號是可選的。 在編寫復雜程序時避免使用它以減少混淆。

然后您可以以更好的方式編寫相同的代碼(不要忘記注釋):

#include <iostream>
#include <vector>

using namespace std;

// defining a templated-function
template<class T>
void removeFirstFromVec(vector<T>& vecLink) {
    vecLink.erase(vecLink.begin());
}

int main(void) {
    // initializing with direct-initialization method
    vector<int> myVec {1, 2, 3};

    cout << "Before removal\n";

    // no braces
    for (auto& i : myVec)
        // 'i' isn't an index here, it's an element
        cout << i << endl;

    removeFirstFromVec(myVec);

    cout << "After removal\n";

    // no braces    
    for (auto& i : myVec)
        cout << i << endl;

    return 0;
}

暫無
暫無

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

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