如何使用迭代器浏览vector? (C ++)
目标是访问stringvector的“nth”元素,而不是[]运算符或“at”方法。 据我所知,迭代器可以用来浏览容器,但我从来没有使用过迭代器,而我正在阅读的内容令人困惑。
如果有人可以给我一些关于如何实现这一目标的信息,我将不胜感激。 谢谢。
您需要使用vector
类的begin
和end
方法,它们分别返回指向第一个和最后一个元素的迭代器。
using namespace std; vector<string> myvector; // a vector of stings. // push some strings in the vector. myvector.push_back("a"); myvector.push_back("b"); myvector.push_back("c"); myvector.push_back("d"); vector<string>::iterator it; // declare an iterator to a vector of strings int n = 3; // nth element to be found. int i = 0; // counter. // now start at from the beginning // and keep iterating over the element till you find // nth element...or reach the end of vector. for(it = myvector.begin(); it != myvector.end(); it++,i++ ) { // found nth element..print and break. if(i == n) { cout<< *it << endl; // prints d. break; } } // other easier ways of doing the same. // using operator[] cout<<myvector[n]<<endl; // prints d. // using the at method cout << myvector.at(n) << endl; // prints d.
通常,迭代器用于以线性方式访问容器的元素; 然而,对于“随机访问迭代器”,可以像operator[]
那样访问任何元素。
要访问向量 vec
任意元素 ,可以使用以下命令:
vec.begin() // 1st vec.begin()+1 // 2nd // ... vec.begin()+(i-1) // ith // ... vec.begin()+(vec.size()-1) // last
以下是一个典型的访问模式 (早期版本的C ++)的例子:
int sum = 0; using Iter = std::vector<int>::const_iterator; for (Iter it = vec.begin(); it!=vec.end(); ++it) { sum += *it; }
使用迭代器的优点是可以将其他容器应用于相同的模式 :
sum = 0; for (Iter it = lst.begin(); it!=lst.end(); ++it) { sum += *it; }
出于这个原因,创build模板代码非常容易, 无论容器types如何,它们的工作方式都是相同的 。 迭代器的另一个优点是它不假设数据驻留在内存中; 例如,可以创build一个前向迭代器,可以从inputstream中读取数据,或者即时生成数据(例如范围或随机数生成器)。
另一个select使用std::for_each
和lambdas:
sum = 0; std::for_each(vec.begin(), vec.end(), [&sum](int i) { sum += i; });
由于C ++ 11,你可以使用auto
来避免指定迭代器的非常长,复杂的types名称(或者更复杂):
sum = 0; for (auto it = vec.begin(); it!=vec.end(); ++it) { sum += *it; }
此外,还有一个更简单的方法 – 每个变体:
sum = 0; for (auto value : vec) { sum += value; }
最后还有std::accumulate
,你必须小心不pipe你是加整数还是浮点数。
Vector的迭代器是随机访问迭代器,这意味着它们的外观和感觉像普通的指针。
您可以通过将n添加到从容器的begin()
方法返回的迭代器来访问第n个元素,或者可以使用operator []
。
std::vector<int> vec(10); std::Vector<int>::iterator it = vec.begin(); int sixth = *(it + 5); int third = *(2 + it); int second = it[1];
或者,你可以使用与各种迭代器一起工作的advance函数。 (你必须考虑你是否真的想用非随机访问迭代器来执行“随机访问”,因为这可能是一个昂贵的事情)。
std::vector<int> vec(10); std::vector<int>::iterator it = vec.begin(); std::advance(it, 5); int sixth = *it;