1. 程式人生 > >C++:STL常用函式模組總結(vector)

C++:STL常用函式模組總結(vector)

vector容器

相當於可變陣列,相比於陣列佔用更多的空間(額外空間以備擴容使用),和陣列一樣直接訪問元素。但是在中間位置(不是末尾)使用插入操作和刪除操作時表現的不是很好。

使用時新增:

#include <vector>
using namespace std; //不新增這句時,使用vector的成員需要加字首std::

定義方法1:

#include <iostream>
#include <vector>

int main ()
{
  std::vector<int> first;        // 空int型vector
std::vector<int> second (4,100); // 四個int型資料每個為100 std::vector<int> third (second.begin(),second.end()); // 通過指標複製second std::vector<int> fourth (third); // 通過複製函式複製third // 指標構造器也可以適用於陣列中: int myints[] = {16,2,77,29}; std::vector<int> fifth (myints, myints + sizeof
(myints) / sizeof(int) ); std::cout << "The contents of fifth are:"; for (std::vector<int>::iterator it = fifth.begin(); it != fifth.end(); ++it) std::cout << ' ' << *it; std::cout << '\n'; std::vector<int> myints2 = {1,2,3,4,5}; //c99中不支援此定義 c11支援 std
::cout << "The contents of myints2 are:"; for(int i = 0; i < myints2.size(); i++) printf("%d",myints2[i]); return 0; }

output:
The contents of fifth are: 16 2 77 29
The contents of fifth are: 12345

定義方法2

#include <iostream>
#include <vector>

int main ()
{
  std::vector<int> foo (3,0);
  std::vector<int> bar (5,0);

  bar = foo;
  foo = std::vector<int>();

  std::cout << "Size of foo: " << int(foo.size()) << '\n';
  std::cout << "Size of bar: " << int(bar.size()) << '\n';
  return 0;
}

output:
Size of foo: 0
Size of bar: 3

基本操作

1、vector::size:返回當前元素數量

2、vector::begin:返回指向第一個元素的指標

3、vector::end:返回指向最後一個元素的指標

4、vector::push_back(para):在末尾新增元素para

5、vector::pop_back:刪除末尾的元素

6、vector::empty():如果容器元素容量為空,返回真,反之返回假

示例程式1:

#include <iostream>     // std::cout
#include <vector>       // std::vector, std::begin, std::end

int main () {
  int foo[] = {10,20,30,40,50};
  std::vector<int> bar;

  //迭代foo,將內容插入bar
  for (auto it = std::begin(foo); it!=std::end(foo); ++it)
    bar.push_back(*it);

  // 迭代bar,列印內容
  std::cout << "bar contains:";
  for (auto it = std::begin(bar); it!=std::end(bar); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

  return 0;
}

bar contains:
10 20 30 40 50

示例程式2

#include <iostream>
#include <vector>

int main ()
{
  std::vector<int> myints;
  std::cout << "0. size: " << myints.size() << '\n';

  for (int i=0; i<10; i++) myints.push_back(i);
  std::cout << "1. size: " << myints.size() << '\n';

  myints.insert (myints.end(),10,100);
  std::cout << "2. size: " << myints.size() << '\n';

  myints.pop_back();
  std::cout << "3. size: " << myints.size() << '\n';

  return 0;
}

output:

0. size: 0
1. size: 10
2. size: 20
3. size: 19

示例程式3

#include <iostream>
#include <vector>

int main ()
{
  std::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();
  }

  std::cout << "total: " << sum << '\n';

  return 0;
}

output:

total: 55

7、vector::back():返回指向容器中的最後一個元素(不是指標)

8、vector::front():返回指向容器中的第一個元素(不是指標)

如果在空容器中呼叫此函式會產生未知的行為,另外注意的是,此函式返回的是元素的引用,意味著可以通過引用來更改此元素,除非這個容器是const型的,這樣的話這兩個函式就會返回const_reference

示例程式1

// vector::back
#include <iostream>
#include <vector>

int main ()
{
  std::vector<int> myvector;

  myvector.push_back(10);

  while (myvector.back() != 0)
  {
    myvector.push_back ( myvector.back() -1 );
  }

  std::cout << "myvector contains:";
  for (unsigned i=0; i<myvector.size() ; i++)
    std::cout << ' ' << myvector[i];
  std::cout << '\n';

  return 0;
}

示例程式2

// vector::front
#include <iostream>
#include <vector>

int main ()
{
  std::vector<int> myvector;

  myvector.push_back(78);
  myvector.push_back(16);

  // now front equals 78, and back 16

  myvector.front() -= myvector.back();

  std::cout << "myvector.front() is now " << myvector.front() << '\n';

  return 0;
}

進階操作

1、vector::capacity:返回當前開闢空間的容量數,大於等於size

2、vector::max_size:返回當前vector容器能夠容納的所有容量數(包括未開闢的)

示例程式

// comparing size, capacity and max_size
#include <iostream>
#include <vector>

int main ()
{
  std::vector<int> myvector;

  // set some content in the vector:
  for (int i=0; i<100; i++) myvector.push_back(i);

  std::cout << "size: " << (int) myvector.size() << '\n';
  std::cout << "capacity: " << (int) myvector.capacity() << '\n';
  std::cout << "max_size: " << (int) myvector.max_size() << '\n';
  return 0;
}

output:(一種可能的輸出)

size: 100
capacity: 128
max_size: 1073741823

3、vector::rbegin:返回指向將容器內元素逆轉後第一個元素的指標,注意這個指標是“逆指標”,與普通指標增加地址方向相反(也就是指向原容器最後一個)

4、vector::rend:返回指向將容器內元素逆轉後最後一個元素的指標,注意這個指標是“逆指標”,與普通指標增加地址方向相反(也就是指向原容器第一個)

示例程式

#include <iostream>
#include <vector>

int main ()
{
  std::vector<int> myvector (5);  // 定義擁有5個空元素的容器

  int i=0;

  std::vector<int>::reverse_iterator rit = myvector.rbegin();
  for (; rit!= myvector.rend(); ++rit)
    *rit = ++i;

  std::cout << "myvector contains:";
  for (std::vector<int>::iterator it = myvector.begin(); it != myvector.end(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

  return 0;
}

output:

myvector contains: 5 4 3 2 1

5、vector::resize(n,val):調整當前的vector容量為n,如果n小於當前size,則保留前n個元素,其他的銷燬;如果n大於size,則擴充容量至n,根據val是否表明來初始化多出的元素,沒有表明val則普通初始化,如果n同時大於capacity,則自動調整空間大小

示例程式

#include <iostream>
#include <vector>

int main ()
{
  std::vector<int> myvector;

  // set some initial content:
  for (int i=1;i<10;i++) myvector.push_back(i);

  myvector.resize(5);
  myvector.resize(8,100);
  myvector.resize(12);

  std::cout << "myvector contains:";
  for (int i=0;i<myvector.size();i++)
    std::cout << ' ' << myvector[i];
  std::cout << '\n';

  return 0;
}

output:

myvector contains: 1 2 3 4 5 100 100 100 0 0 0 0

6、vector::insert():在指定位置插入元素,有五種過載函式:

iterator insert (const_iterator position, const value_type& val);   
iterator insert (const_iterator position, size_type n, const value_type& val);
template <class InputIterator>
iterator insert (const_iterator position, InputIterator first, InputIterator last); 
iterator insert (const_iterator position, value_type&& val);
iterator insert (const_iterator position, initializer_list<value_type> il);
//position:插入位置
//val:要插入的值 n:插入元素的數量 first,last:插入的範圍  il:具有初始化功能的物件

示例程式

#include <iostream>
#include <vector>

int main ()
{
  std::vector<int> myvector (3,100);
  std::vector<int>::iterator it;

  it = myvector.begin();
  it = myvector.insert ( it , 200 );

  myvector.insert (it,2,300);

  // "it" 不再有效, 設定一個新的:
  it = myvector.begin();

  std::vector<int> anothervector (2,400);
  myvector.insert (it+2,anothervector.begin(),anothervector.end());

  int myarray [] = { 501,502,503 };
  myvector.insert (myvector.begin(), myarray, myarray+3);

  std::cout << "myvector contains:";
  for (it=myvector.begin(); it<myvector.end(); it++)
    std::cout << ' ' << *it;
  std::cout << '\n';

  return 0;
}

output:

myvector contains: 501 502 503 300 300 400 400 200 100 100 100

7、vector::erase():移除一個位置或一段範圍內的元素(兩個過載):

iterator erase (const_iterator position); //特定位置的
iterator erase (const_iterator first, const_iterator last); //一段範圍內

示例程式

#include <iostream>
#include <vector>

int main ()
{
  std::vector<int> myvector;

  // 設定一些值 (從 1 到 10)
  for (int i=1; i<=10; i++) myvector.push_back(i);

  // 去除第六個元素
  myvector.erase (myvector.begin()+5);

  // 去除前三個元素:
  myvector.erase (myvector.begin(),myvector.begin()+3);

  std::cout << "myvector contains:";
  for (unsigned i=0; i<myvector.size(); ++i)
    std::cout << ' ' << myvector[i];
  std::cout << '\n';

  return 0;
}

output:

myvector contains: 4 5 7 8 9 10

8、vector::clear:清除容器中所有的元素,容器容量歸為0

示例程式

#include <iostream>
#include <vector>

int main ()
{
  std::vector<int> myvector;
  myvector.push_back (100);
  myvector.push_back (200);
  myvector.push_back (300);

  std::cout << "myvector contains:";
  for (unsigned i=0; i<myvector.size(); i++)
    std::cout << ' ' << myvector[i];
  std::cout << '\n';

  myvector.clear();
  myvector.push_back (1101);
  myvector.push_back (2202);

  std::cout << "myvector contains:";
  for (unsigned i=0; i<myvector.size(); i++)
    std::cout << ' ' << myvector[i];
  std::cout << '\n';

  return 0;
}