VC中vector用法

来源:互联网 发布:飞鸽传书网络打印机 编辑:程序博客网 时间:2024/06/05 06:37

VC中vector用法

vector是C++标准模板库中的部分内容,中文偶尔译作“容器”,但并不准确。它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。

简单的使用方法如下:

  vector<int> test;//建立一个vector

  test.pushback(1);//把1和2压入vector 这样test[0]就是1,test[1]就是2

  test.pushback(2);

  我们可以用一个迭代器:

  vector<int>::iterator iter=text.begin();//定义一个可以迭代int型vector的迭代器iter,它指向text的首位,迭代器跟指针差不多

  while(;iter!=text.end();iter++) cout<<(*iter);//iter++指的是向前迭代一位,直到iter到超出末端迭代器为止,输出迭代器指向的值

为了可以使用vector,必须在你的头文件中包含下面的代码:

  #include <vector>

  vector属于std命名域的,因此需要通过命名限定,如下完成你的代码:

  using std::vector;

  vector<int> vInts;

  或者连在一起,使用全名:

  std::vector<int> vInts;

  建议使用全局的命名域方式:using namespace std;

     

函数

  表述

  c.assign(beg,end)c.assign(n,elem)

  将[beg; end)区间中的数据赋值给c。将n个elem的拷贝赋值给c。

  c.at(idx)

  传回索引idx所指的数据,如果idx越界,抛出out_of_range。

  c.back()

  传回最后一个数据,不检查这个数据是否存在。

  c.begin()

  传回迭代器中的第一个数据地址。

  c.capacity()

  返回容器中数据个数。

  c.clear()

  移除容器中所有数据。

  c.empty()

  判断容器是否为空。

  c.end()

  指向迭代器中末端元素的下一个,指向一个不存在元素。

  c.erase(pos)

  c.erase(beg,end)

  删除pos位置的数据,传回下一个数据的位置。

  删除[beg,end)区间的数据,传回下一个数据的位置。

  c.front()

  传回第一个数据。

  get_allocator

  使用构造函数返回一个拷贝。

  c.insert(pos,elem)

  c.insert(pos,n,elem)

  c.insert(pos,beg,end)

  在pos位置插入一个elem拷贝,传回新数据位置。在pos位置插入n个elem数据。无返回值。在pos位置插入在[beg,end)区间的数据。无返回值。

  c.max_size()

  返回容器中最大数据的数量。

  c.pop_back()

  删除最后一个数据。

  c.push_back(elem)

  在尾部加入一个数据。

  c.rbegin()

  传回一个逆向队列的第一个数据。

  c.rend()

  传回一个逆向队列的最后一个数据的下一个位置。

  c.resize(num)

  重新指定队列的长度。

  c.reserve()

  保留适当的容量。

  c.size()

  返回容器中实际数据的个数。

  c1.swap(c2)

  swap(c1,c2)

  将c1和c2元素互换。同上操作。

  vector<Elem>

       cvector<Elem> c1(c2)

  vector <Elem> c(n)

  ector <Elem> c(n, elem)

  vector <Elem> c(beg,end)

  c.~ vector <Elem>()

      创建一个空的vector。复制一个vector。创建一个vector,含有n个数据,数据均已缺省构造产生。创建一个含有n个elem拷贝的vector。创建一个以[beg;end)区间的vector。销毁所有数据,释放内存。

      operator[]

  返回容器中指定位置的一个引用

      使用两种方法来访问vector。

  1、 vector::at()

  2、 vector::operator[]

  operator[]主要是为了与C语言进行兼容

     

它可以像C语言数组一样操作。但at()是我们的首选,因为at()进行了边界检查,如果访问超过了vector的范围,将抛出一个例外。由于operator[]容易造成一些错误,所有我们很少用它,下面进行验证一下:

  分析下面的代码:

  vector<int> v;

  v.reserve(10);

  for(int i=0; i<7; i++) {

  v.push_back(i);

  }

  try {int iVal1 = v[7];

  // not bounds checked - will not throw

  int iVal2 = v.at(7);

  // bounds checked - will throw if out of range

  } catch(const exception& e) {

  cout << e.what();

  }

  删除vector中的数据

  vector能够非常容易地添加数据,也能很方便地取出数据,同样vector提供了erase(),pop_back(),clear()来删除数据,当删除数据时,应该知道要删除尾部的数据,或者是删除所有数据,还是个别的数据。

  Remove_if()算法 如果要使用remove_if(),需要在头文件中包含如下代码::

  #include <algorithm>

  Remove_if()有三个参数:

  1、 iterator _First:指向第一个数据的迭代指针。

  2、 iterator _Last:指向最后一个数据的迭代指针。

  3、 predicate _Pred:一个可以对迭代操作的条件函数

 

VC之vector综合运用

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <iterator>
using namespace std;

void main()
{
    // create empty vector for strings
    vector<string> sentence;

    // reserve memory for five Items to avoid reallocation
    sentence.reserve(5);

    // append some Items
    sentence.push_back("Hello,");
    sentence.push_back("how");
    sentence.push_back("are");
    sentence.push_back("you");
    sentence.push_back("?");

    // assign "!" to the last Item
    sentence.back() = "!";

    // print Items separated with spaces
    copy (sentence.begin(), sentence.end(),
          ostream_iterator<string>(cout," "));
    cout << endl;
}

//wll print Hello,how are you !

 

#include <iostream>
#include <cassert>
#include <vector>
using namespace std;

int main()
{
  char name[] = "abcedfghijklmn";
  vector<char> myVector(name, name + 6);

  vector<char> myVector2(myVector); // Uses copy constructor
  assert (myVector2 == myVector);

  return 0;
}

 

 

#include <vector>
#include <iostream>
using namespace std;
long k;
int main()
{
  const long N = 600000; // Length of tuples x and y
  const long S = 10;     // Sparseness factor

  vector<double> x(N), y(N);


  for ( k= 0; 3 * k * S < N; ++k)
    x[3 * k * S] = 1.0;
  for (long k = 0; 5 * k * S < N; ++k)
    y[5 * k * S] = 1.0;

  double sum = 0.0;
  for ( k = 0; k < N; ++k)
    sum += x[k] * y[k];

  cout << sum << endl;
  return 0;
} //4000

 

#include <iostream>
#include <cassert>
#include <vector>
using namespace std;

class MyClass {
public:
  unsigned long id;
  unsigned long generation;
  static unsigned long total_copies;

  MyClass() : id(0), generation(0) { }

  MyClass(unsigned long n) : id(n), generation(0) { }

  MyClass(const MyClass& z) : id(z.id), generation(z.generation + 1) {
    ++total_copies;
  }
};

bool operator==(const MyClass& x, const MyClass& y)
{
  return x.id == y.id;
}

bool operator!=(const MyClass& x, const MyClass& y)
{
  return x.id != y.id;
}

unsigned long MyClass::total_copies = 0;

int main()
{
  vector<MyClass> vector1, vector2(3);

  assert (vector1.size() == 0);
  assert (vector2.size() == 3);

  assert (vector2[0] == MyClass() && vector2[1] == MyClass() &&
          vector2[2] == MyClass());

  for (int i = 0; i != 3; ++i)
    cout << "vector2[" << i << "].generation: " << vector2[i].generation << endl;

  cout << "Total copies: " << MyClass::total_copies << endl;
  return 0;
}

       

 

0 0
原创粉丝点击