时不可以苟遇,道不可以虚行。
STL 中最常用的容器为:vector
,暂且把它理解为我们之前学过的数组Array
。
#include
vector<int> v;
push_back()
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
while
循环,依次遍历容器中的元素。 vector<int>::iterator itBegin = v.begin(); //起始迭代器,指向容器中第一个元素
vector<int>::iterator itEnd = v.end(); //结束迭代器,指向容器中最后一个元素的下一个位置
while (itBegin != itEnd) {
cout << *itBegin << endl;
itBegin++;
}
for
循环,定义一个临时的起始迭代器指向容器 v
中第一个元素,当 该迭代器 指向位置到达容器 v 中的最后一个元素的下一个位置时,结束循环。 for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
cout << *it << endl;
}
for_each
遍历算法#include
,标准算法的头文件 void myPrint(int val) {
cout << val << endl;
}
//最后一个参数为:传入函数名,回调作用
for_each(v.begin(), v.end(), myPrint);
for_each
函数的定义,其实现方法也是使用一层 for
循环。 for_each(_InputIterator __first, _InputIterator __last, _Function __f)
{
// concept requirements
__glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
__glibcxx_requires_valid_range(__first, __last);
for (; __first != __last; ++__first)
__f(*__first);
return __f; // N.B. [alg.foreach] says std::move(f) but it's redundant.
}
Person
类:class Person {
public:
Person(string name, int age) {
this->m_Name = name;
this->m_Age = age;
}
string m_Name;
int m_Age;
};
vector<Person> v;
Person
类对象,作为存储数据: Person p1("a", 1);
Person p2("b", 2);
Person p3("n", 3);
Person p4("m", 3);
Person p5("u", 3);
v.push_back(p1);
v.push_back(p2);
v.push_back(p3);
v.push_back(p4);
v.push_back(p5);
<>
中的数据类型是什么,(*it)
取出来的东西就是什么)<>
中的是 Person
,所以 (*it)
表示的是 Person
对象,it
表示的是 Person
对象的地址,也可以直接通过 it->m_Name
和 it->m_Age
(地址指向)的方式,取出数据。 for (vector<Person>::iterator it = v.begin(); it != v.end(); it++) {
cout << "姓名:" << (*it).m_Name << " 年龄:" << (*it).m_Age << endl;
}
for (vector<Person>::iterator it = v.begin(); it != v.end(); it++) {
cout << "姓名:" << it->m_Name << " 年龄:" << it->m_Age << endl;
}
Person
类:class Person {
public:
Person(string name, int age) {
this->m_Name = name;
this->m_Age = age;
}
string m_Name;
int m_Age;
};
vector<Person*> v;
Person
类对象,作为存储数据: Person p1("a", 1);
Person p2("b", 2);
Person p3("n", 3);
Person p4("m", 3);
Person p5("u", 3);
&
) v.push_back(&p1);
v.push_back(&p2);
v.push_back(&p3);
v.push_back(&p4);
v.push_back(&p5);
<>
中的数据类型是什么,(*it)
取出来的东西就是什么)<>
的是 Person*
,所以 (*it)
表示的是 Person
对象的地址,可以通过 (*it)->m_Name
和 (*it)->m_Age
的方式,取出数据。