提问者:小点点

如何迭代向量


我有这样的密码

#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而不是,不会出现这样的错误(int i=0;i<...size();i++)


共3个答案

匿名用户

在基于范围的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;
}

将输出以下内容:

5
3
2

匿名用户

如果执行以下操作:

>

  • 使用模板函数接受向量的任何类型。

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

    单个语法的大括号是可选的。 避免使用它,以减少在编写复杂程序时的混乱。

    然后您可以用更好的方式编写相同的代码(不要忘记注释):

    #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;
    }