我有这样的密码
#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++)
在基于范围的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;
}