vector 内部方法大全 学习(初学者的参考资料)

本文详细介绍了C++ Standard Template Library中的vector容器。探讨了vector的构造、析构及多种成员函数的应用,包括赋值、元素访问、插入、删除等操作,并提供了丰富的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

STL容器之vector学习。

平时写程序的时候,用到的vector容器是非常多了。今天系统整理一下vector 内部的一些方法。

Vector 是一种顺序性的容器,按照严格线性存储各种对象。他其实就是一种动态的数组,正如数组,、vector有他们存储在存储单元相邻元素,这就意味着他们的元素可以被存取不只有使用迭代器还定期使用指针抵消元素。但是不像普通的数组,存储在向量自动处理,允许它的扩展和简约的需要。

Vector 可以方便的做一下:

  • 可以通过下标直接访问元素 (常量时间).
  • 用任何顺序迭代元素(linear time).
  • 在尾部添加删除元素 (constant amortized time).

在C++ Standard Template Library 中,vector有两个参数

template < class T, class Allocator = allocator<T> > class vector;

这两个参数的意义:

  • T: 元素的类型
  • Allocator: 元素所要分配的空间大小。

下面就一一介绍Vector的内部方法

1 vector构造函数:也就是如何对一个vec对象进行初始化。 代码// explicit vector ( const Allocator& = Allocator() ); explicit vector ( size_type n, const T& value= T(), const Allocator& = Allocator() ); template <class InputIterator> vector ( InputIterator first, InputIterator last, const Allocator& = Allocator() ); vector ( const vector<T,Allocator>& x ); 代码// 参数解释:n,初始化元素个数。 T,你所要添加进去的元素。 First,容器第一个元素,last最后一个元素,一个vector的引用。 示例: // constructing vectors #include <iostream> #include <vector> using namespace std; int main () { unsigned int i; // constructors used in the same order as described above: vector<int> first; // 初始化一个int类型的空vector变量 vector<int> second (4,100); // 初始化4个100 vector<int> third (second.begin(),second.end()); // 通过second 进行赋值 vector<int> fourth (third); // a copy of third // the iterator constructor can also be used to construct from arrays: int myints[] = {16,2,77,29}; vector<int> fifth (myints, myints + sizeof(myints) / sizeof(int) ); cout << "The contents of fifth are:"; for (i=0; i < fifth.size(); i++) cout << " " << fifth[i]; cout << endl; return 0; } 输出结果: The contents of fifth are: 16 2 77 29 2 vector::~vector析构函数 调用每一个元素对象的析构函数 成员函数 3 vector::assign template <class InputIterator> void assign ( InputIterator first, InputIterator last ); void assign ( size_type n, const T& u ); 如 c.assign(beg,end)c.assign(n,elem)   将[beg; end)区间中的数据赋值给c。将n个elem的拷贝赋值给c。 示例: // vector assign #include <iostream> #include <vector> using namespace std; int main () { vector<int> first; vector<int> second; vector<int> third; first.assign (7,100); // a repetition 7 times of value 100 vector<int>::iterator it; it=first.begin()+1; second.assign (it,first.end()-1); // the 5 central values of first int myints[] = {1776,7,4}; third.assign (myints,myints+3); // assigning from array. cout << "Size of first: " << int (first.size()) << endl; cout << "Size of second: " << int (second.size()) << endl; cout << "Size of third: " << int (third.size()) << endl; return 0; } 输出结果 Size of first: 7 Size of second: 5 Size of third: 3 4 vector::at const_reference at ( size_type n ) const; reference at ( size_type n ); 返回vector内的n的引用。 代码示例 // vec.cpp : Defines the entry point for the console application. // #include "stdafx.h" // constructing vectors #include <iostream> #include <vector> using namespace std; int main () { vector<int> myvector(10);//初始化10个为0的元素。 unsigned int i; for (i=0;i<myvector.size();i++) { myvector.at(i)=i; } cout << "myvector contains:"; for (i=0; i<myvector.size(); i++) cout << " " << myvector.at(i); cout << endl; return 0; } 5 vector::back reference back ( ); const_reference back ( ) const; 返回上一个元素的引用 // vector::back #include <iostream> #include <vector> using namespace std; int main () { vector<int> myvector; myvector.push_back(10); while (myvector.back() != 0) { myvector.push_back ( myvector.back() -1 ); } cout << "myvector contains:"; for (unsigned i=0; i<myvector.size() ; i++) cout << " " << myvector[i]; cout << endl; return 0; } Output: myvector contains: 10 9 8 7 6 5 4 3 2 1 0 vector::begin iterator begin (); const_iterator begin () const; 示例 // vector::begin #include <iostream> #include <vector> using namespace std; int main () { vector<int> myvector; for (int i=1; i<=5; i++) myvector.push_back(i); vector<int>::iterator it; cout << "myvector contains:"; for ( it=myvector.begin() ; it < myvector.end(); it++ ) cout << " " << *it; cout << endl; return 0; } Output: myvector contains: 1 2 3 4 5 6 vector::capacity 返回vector对象存储空间大小 例子: // comparing size, capacity and max_size #include <iostream> #include <vector> using namespace std; int main () { vector<int> myvector; // set some content in the vector: for (int i=0; i<100; i++) myvector.push_back(i); cout << "size: " << (int) myvector.size() << "\n"; cout << "capacity: " << (int) myvector.capacity() << "\n"; cout << "max_size: " << (int) myvector.max_size() << "\n"; return 0; } A possible output for this program could be: size: 100 capacity: 141 max_size: 1073741823 7 vector::clear 清除对象内的所有元素,就是调用了析构函数,清空,然后为0 示例 // clearing vectors #include <iostream> #include <vector> using namespace std; int main () { unsigned int i; vector<int> myvector; myvector.push_back (100); myvector.push_back (200); myvector.push_back (300); cout << "myvector contains:"; for (i=0; i<myvector.size(); i++) cout << " " << myvector[i]; myvector.clear(); myvector.push_back (1101); myvector.push_back (2202); cout << "\nmyvector contains:"; for (i=0; i<myvector.size(); i++) cout << " " << myvector[i]; cout << endl; return 0; } 8 vector::empty bool empty () const; 判断vector对象时否为空。 示例: // vector::empty #include <iostream> #include <vector> using namespace std; int main () { vector<int> myvector; int sum (0); for (int i=1;i<=10;i++) myvector.push_back(i); while (!myvector.empty()) { sum += myvector.back(); myvector.pop_back(); } cout << "total: " << sum << endl; return 0; } 9 vector::end iterator end (); const_iterator end () const; Returns an iterator referring to the past-the-end element in the vector container. Both iterator and const_iterator are member types. In the vector class template, these are random access iterators // test_vector.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <vector> #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { vector<int> myvec; for (int i=0;i<6;i++) { myvec.insert(myvec.end(),i); } cout<<"element"; vector<int>::iterator it; for (it=myvec.begin();it<myvec.end();it++) { cout<<" "<<(*it)<<endl; } return 0; } 10 vector::erase iterator erase ( iterator position ); iterator erase ( iterator first, iterator last ); 删除vector对象里的一个元素或者一个范围内的元素([first,last)). 示例: // erasing from vector #include <iostream> #include <vector> using namespace std; int main () { unsigned int i; vector<unsigned int> myvector; // set some values (from 1 to 10) for (i=1; i<=10; i++) myvector.push_back(i); // erase the 6th element myvector.erase (myvector.begin()+5); // erase the first 3 elements: myvector.erase (myvector.begin(),myvector.begin()+3); cout << "myvector contains:"; for (i=0; i<myvector.size(); i++) cout << " " << myvector[i]; cout << endl; return 0; } Output: myvector contains: 4 5 7 8 9 10 11 vector::front reference front ( ); const_reference front ( ) const; Returns a reference to the first element in the vector container. #include <iostream> #include <vector> using namespace std; int main () { vector<int> myvector; myvector.push_back(78); myvector.push_back(16); // now front equals 78, and back 16 myvector.front() -= myvector.back(); cout << "myvector.front() is now " << myvector.front() << endl; return 0; } Output: myvector.front() is now 62 12 vector::get_allocator allocator_type get_allocator() const; // test_vector.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <vector> #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { vector<int> myvector; int* p; unsigned int i; p=myvector.get_allocator().allocate(5); for (int i=0;i<5;i++) { p[i]=i; } cout << "The allocated array contains:"; for (i=0; i<5; i++) cout << " " << p[i]; cout << endl; myvector.get_allocator().deallocate(p,5); return 0; } The allocated array contains: 0 1 2 3 4 13 vector::insert iterator insert ( iterator position, const T& x ); void insert ( iterator position, size_type n, const T& x ); template <class InputIterator> void insert ( iterator position, InputI last ); // test_vector.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <vector> #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { vector<int> myvector(3,100); vector<int> ::iterator it; it=myvector.begin(); it=myvector.insert(it,200); myvector.insert(it,2,300); it=myvector.begin(); vector<int> anothervector(2,400); myvector.insert(it+2,anothervector.begin(),anothervector.end()); int array[]={501,502,503}; myvector.insert(myvector.begin(),array,array+3); cout << "myvector contains:"; for (vector<int>::iterator it=myvector.begin();it<myvector.end();it++) { cout<<" "<<*it; } return 0; } Output: myvector contains: 501 502 503 300 300 400 400 200 100 100 100 14 vector::max_size size_type max_size () const; 返回改容器能持有的最大元素数,看一下例子,查看区别 // comparing size, capacity and max_size #include <iostream> #include <vector> using namespace std; int main () { vector<int> myvector; // set some content in the vector: for (int i=0; i<100; i++) myvector.push_back(i); cout << "size: " << myvector.size() << "\n"; cout << "capacity: " << myvector.capacity() << "\n"; cout << "max_size: " << myvector.max_size() << "\n"; return 0; } A possible output for this program could be: size: 100 capacity: 141 max_size: 1073741823 15 vector::operator= vector<T,Allocator>& operator= (const vector<T,Allocator>& x); 重载“=”操作符 // vector assignment #include <iostream> #include <vector> using namespace std; int main () { vector<int> first (3,0); vector<int> second (5,0); second=first; first=vector<int>(); cout << "Size of first: " << int (first.size()) << endl; cout << "Size of second: " << int (second.size()) << endl; return 0; } 输出结果: Size of first: 0 Size of second: 3 16 vector::operator[] reference operator[] ( size_type n ); const_reference operator[] ( size_type n ) const; Returns a reference to the element at position n in the vector container. 返回vector容器内位置为n的元素的引用 和at()函数相同的功能,就是at()不在范围内会抛异常 示例 // test_vector.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <vector> #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { vector<int> myvector(10); unsigned int i; vector<int> ::size_type size=myvector.size(); for (i=0;i<10;i++) { myvector[i]=i; } for (i=0;i<size/2;i++) { int temp=myvector[size-1-i]; myvector[size-1-i]=myvector[i]; myvector[i]=temp; } for (i=0;i<10;i++) { cout<<" "<<myvector[i]; } cout<<endl; return 0; } Output: myvector contains: 9 8 7 6 5 4 3 2 1 0 17 vector::pop_back void pop_back ( ); 移出元素 示例 // vector::pop_back #include <iostream> #include <vector> using namespace std; int main () { vector<int> myvector; int sum (0); myvector.push_back (100); myvector.push_back (200); myvector.push_back (300); while (!myvector.empty()) { sum+=myvector.back(); myvector.pop_back(); } cout << "The elements of myvector summed " << sum << endl; return 0; } 输出结果:The elements of myvector summed 600 18 vector::push_back void push_back ( const T& x ); 在末尾处添加一个元素 // vector::push_back #include <iostream> #include <vector> using namespace std; int main () { vector<int> myvector; int myint; cout << "Please enter some integers (enter 0 to end):\n"; do { cin >> myint; myvector.push_back (myint); } while (myint); cout << "myvector stores " << (int) myvector.size() << " numbers.\n"; return 0; } 19 vector::rbegin reverse_iterator rbegin(); const_reverse_iterator rbegin() const; 按照反序迭代输出 示例 // test_vector.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <vector> #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { vector<int> myvector(10); unsigned int i; vector<int> ::size_type size=myvector.size(); for (i=0;i<10;i++) { myvector[i]=i; } vector<int>::reverse_iterator it; for (it=myvector.rbegin();it<myvector.rend();it ++) { cout<<" "<<*it; } cout<<endl; return 0; } 输出结果:9 8 7 6 5 4 3 2 1 0 20 vector::rend public member function reverse_iterator rend(); const_reverse_iterator rend() const; 代码 同上 21 vector::reserve void reserve ( size_type n ); Request a change in capacity Requests that the capacity of the allocated storage space for the elements of the vector container be at least enough to hold n elements. 示例 // vector::reserve #include <iostream> #include <fstream> #include <vector> using namespace std; int main () { vector<int> content; size_t filesize; ifstream file ("test.bin",ios::in|ios::ate|ios::binary); if (file.is_open()) { filesize=file.tellg(); content.reserve(filesize); file.seekg(0); while (!file.eof()) { content.push_back( file.get() ); } // print out content: vector<int>::iterator it; for (it=content.begin() ; it<content.end() ; it++) cout << hex << *it; } return 0; } 22 vector::resize void resize ( size_type sz, T c = T() ); // resizing vector #include <iostream> #include <vector> using namespace std; int main () { vector<int> myvector; unsigned int i; // set some initial content: for (i=1;i<10;i++) myvector.push_back(i); myvector.resize(5); myvector.resize(8,100); myvector.resize(12); cout << "myvector contains:"; for (i=0;i<myvector.size();i++) cout << " " << myvector[i]; cout << endl; return 0; } myvector contains: 1 2 3 4 5 100 100 100 0 0 0 0 23 vector::size size_type size() const; 返回元素个数 示例: // vector::size #include <iostream> #include <vector> using namespace std; int main () { vector<int> myints; cout << "0. size: " << (int) myints.size() << endl; for (int i=0; i<10; i++) myints.push_back(i); cout << "1. size: " << (int) myints.size() << endl; myints.insert (myints.end(),10,100); cout << "2. size: " << (int) myints.size() << endl; myints.pop_back(); cout << "3. size: " << (int) myints.size() << endl; return 0; } Output: 0. size: 0 1. size: 10 2. size: 20 3. size: 19 24 vector::swap 交换vector对象里的数据 // swap vectors #include <iostream> #include <vector> using namespace std; main () { unsigned int i; vector<int> first (3,100); // three ints with a value of 100 vector<int> second (5,200); // five ints with a value of 200 first.swap(second); cout << "first contains:"; for (i=0; i<first.size(); i++) cout << " " << first[i]; cout << "\nsecond contains:"; for (i=0; i<second.size(); i++) cout << " " << second[i]; cout << endl; return 0; Output: first contains: 200 200 200 200 200 second contains: 100 100 100

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值