先看一下代码:
#include <iostream> #include <vector> int main() { std::vector<double> doubleVector; for(size_t i = 0;true;++i) { double temp; std::cin >> temp; if(temp == -1) { break; } doubleVector.push_back(temp); } for(std::vector<double>::iterator iter = std::begin(doubleVector); iter != std::end(doubleVector);++iter) { std::cout << *iter << " "; } return 0; }
std::vector<double>::iterator iter = std::begin(doubleVector)
每一个容器都定义了一个名为 iterator 的类型,来表示这个容器的迭代器,其中std::begin()返回的是容器中第一个元素的迭代器
iter != std::end(doubleVector)
这条语句是检查是否超过了这个容器的尾部序列(也就是检查是否越界);
++iter
我们要养成一个好习惯,那就是采用前置递增,而不是后置递增,因为前置递增返回的是iter的引用,而后置递增iter++,返回的是一个新的迭代器对象,这个效率会低下;
但是我们也可以这样简化代码的书写
#include <iostream> #include <vector> int main() { std::vector<double> doubleVector; for(size_t i = 0;true;++i) { double temp; std::cin >> temp; if(temp == -1) { break; } doubleVector.push_back(temp); } for(auto iter = std::begin(doubleVector);iter != std::end(doubleVector);++iter) { std::cout << *iter << " "; } return 0; }
编译器会根据右侧内容来推测iter的类型;
访问对象元素的字段:
#include <iostream> #include <vector> int main() { std::vector<std::string> stringVector(3,"Hello "); for(auto iter = std::begin(stringVector);iter != std::end(stringVector);++iter) { iter->append("world "); } for(auto iter = std::begin(stringVector);iter != std::end(stringVector);++iter) { std::cout << *iter << std::endl; } return 0; }
还可以这样:
#include <iostream> #include <vector> int main() { std::vector<std::string> stringVector(3,"Hello "); for(auto & iter : stringVector) { iter.append("world "); } for(auto & iter : stringVector) { std::cout << iter << std::endl; } return 0; }
两则是相同的!
const_iterator
普通的iterator支持读和写,但是当对const对象调用std::begin()和std::end()的话,将会得到const_iterator,所以const_iterator只支持读操作,不支持写操作;
interator可以转化为const_iterator但是,const_iterator不会转化为iterator。
#include <iostream> #include <vector> int main() { const std::vector<double> myVector({21l,985,21.3,34.2}); for(std::vector<double>::const_iterator iter = std::begin(myVector); iter != std::end(myVector);++iter) { std::cout << *iter << " "; } return 0; }
其中可以将std::begin()和std::end()换成std::cbegin()和std::cend(); 这里的c是const的意思;注意:这种操作只能在C++14上实践
常用的函数:
1. pop_back();删除最后的元素;
2.insert(),有三种类型参数;
第一种:insert(const_itertor pos,const T& x);
第二种:insert(const_iterator pos,size_type n ,const T& x);在pos位置插上n个x;
第三种:insert(const_iterator pos,inputfirstPos first, inputlastPos last);将范围first和last内的元素插入到pos
3.eras()函数的两种形式:
eras(const_itertor pos);
eras(const_itertor pos , const_itertor lastPos); //删除一个范围
4.clear() 清除所有的数据
#include <iostream> #include <vector> template<typename T> void printVector(std::vector<T> &tVector) { for(auto &iter : tVector) { std::cout << iter << " "; } std::cout << std::endl; } int main() { std::vector<int> oneVector({1,2,3,4,5}); std::vector<int> twoVector; for(size_t i = 0;i < 5;++i) { twoVector.push_back(i+6); } std::cout << "oneVector :"; printVector(oneVector); std::cout << "twoVector :"; printVector(twoVector); oneVector.insert(std::end(oneVector),std::begin(twoVector),std::end(twoVector)); std::cout << "oneVector :"; printVector(oneVector); int tenp = 0; std::cin >> tenp; oneVector.insert(std::end(oneVector),tenp); std::cout << "oneVector :"; printVector(oneVector); oneVector.erase(std::end(oneVector) - 1); //注意这里要+1 std::cout << "oneVector :"; printVector(oneVector); twoVector.pop_back(); std::cout << "twoVector :"; printVector(twoVector); oneVector.clear(); // 清除所有数据 std::cout << "oneVector :"; printVector(oneVector); return 0; }
结果是:
oneVector :1 2 3 4 5
twoVector :6 7 8 9 10
oneVector :1 2 3 4 5 6 7 8 9 10
11
11
oneVector :1 2 3 4 5 6 7 8 9 10 11
oneVector :1 2 3 4 5 6 7 8 9 10
twoVector :6 7 8 9
oneVector :