可对矢量执行的操作
所有的STL容器都提供了一个基本方法,其中包括
size() 返回容器中元素数目 swap() 交换两个容器的内容 begin() 返回一个指向容器中第一个元素的迭代器 end() 返回一个表示超过容器尾的迭代器
什么是迭代器?它是一个广义指针。事实上,它可以是指针,也可以是一个可对其执行类似指针的操作--如解除引用(如operator*())和递增(如operator++())的对象。通过将指针广义化为迭代器,让STL能够为各种不同的容器类(包括那些简单指针无法处理的类)提供统一的接口。每个容器类都定义了一个合适的迭代器,该迭代器的类型是一个名为iterator的typedef,其作用域为整个类。
例如,要为vector的double类型规范声明一个迭代器:
vector<double>::iterator pd;
假设scores是一个vector<double>对象:
vector<double> scores;
则可以使用迭代器pd执行这样的操作:
pd = scores.begin();
*pd = 22.3;
++pd;
迭代器的行为就像指针。
C++11自动类型推断很有用的地方。
例如,可以不这样做:
vector<double>::iterator pd = scores.begin();
而这样做:
auto pd = scores.begin();
显示容器的内容
using namespace std;
vector<double> scores(5);
for (int i = 10; i < 15; i++) {
scores[i-10] = i;
}
vector<double>::iterator pd;
for (pd = scores.begin(); pd != scores.end(); pd++) {
cout << *pd << endl;
}
vector模版类也包含一些只有某些STL容器才有的方法。push_back()将元素添加到矢量末尾。
erase()方法删除矢量中给定区间的元素。它接受两个迭代器参数,这些参数定义了要删除的区间。
scores.erase(scores.begin(), scores.begin()+2); // [)
因此[begin(), end()]将包括结合的所有内容。
insert()方法的功能与erase()方法相反。它接受3个迭代器参数,第一个参数指定了新元素的插入位置,第二个和第三个迭起器参数定义了被插入的区间,该区间通常是另一个容器对象的一部分。
例如,将矢量new_v除第一个元素外的所有元素插入到old_v矢量的第一个元素前面:
vector<int> old_v(5);
vector<int> new_v(5);
...
old_v.insert(old_v.begin(), new_v.begin()+1, new_v.end());
old_v.insert(old_v.end(), new_v.begin()+1, new_v.end());
示例:
struct Review
{
std::string title;
int rating;
};
bool FillReview(Review &rr);
void ShowReview(Review &rr);
void VectorTest4()
{
using namespace std;
Review temp;
vector<Review> books;
while(FillReview(temp))
{
books.push_back(temp);
}
unsigned long num = books.size();
if(num > 0)
{
cout << "=======1" << endl;
for (int i = 0; i < num; i++) {
ShowReview(books[i]);
}
cout << "=======2" << endl;
vector<Review>::iterator pr;
for (pr = books.begin(); pr != books.end(); ++pr) {
ShowReview(*pr);
}
cout << "=======3" << endl;
vector<Review> oldlist(books);
if(num > 3)
{
books.erase(books.begin()+1, books.begin()+3);
for (pr=books.begin(); pr != books.end(); ++pr) {
ShowReview(*pr);
}
cout << "=======4" << endl;
books.insert(books.begin(), oldlist.begin()+1, oldlist.begin()+2);
for (pr=books.begin(); pr != books.end(); ++pr) {
ShowReview(*pr);
}
cout << "=======5" << endl;
}
cout << "=======6" << endl;
books.swap(oldlist);
for (pr=books.begin(); pr != books.end(); ++pr) {
ShowReview(*pr);
}
}
else
{
cout << "=======7" << endl;
cout << "nothing" << endl;
}
}
bool FillReview(Review &rr)
{
using namespace std;
cout << "Enter book title:";
getline(cin, rr.title); // 字符串的输入
// cin >> rr.title;
if(rr.title == "quit")
{
return false;
}
cout << "Enter book rating:";
cin >> rr.rating;
if(!cin)
{
return false;
}
while(cin.get()!='\n')
{
continue;
}
return true;
}
void ShowReview(Review &rr)
{
std::cout << "Title :" << rr.title << ",rating :" << rr.rating << std::endl;
}
🔚