vector 基本操作(对象、下标)

来源:互联网 发布:怎么在淘宝卖虚拟产品 编辑:程序博客网 时间:2024/05/17 04:45

来源: http://blog.csdn.net/lovemysea/article/details/5302714


一、vector对象的操作:
1、向vector添加元素
push_back()操作接受一个元素值,并将它作为一个新的元素添加到vector对象的后面,也就是“插入(push)”到vector对象的“后面(back)”:
小例子:
vector<string> text;         // empty vector(空的容器)
while (cin >> word) 
{
    text.push_back(word);    // append word to text(往容器里面塞值)
}

该循环从标准输入读取一系列string对象,逐一追加到vector对象的后面。首先 定义一个空的 vector 对象 text。每循环一次就添加一个新元素到 vector 对象,
并将从输入读取的word值赋予该元素。当循环结束时,text就包含了所有读入的元素。

2、vector下标操作:
vector中的对象是没有命名的,可以按vector中对象的位置来访问它们。通常使用下标操作符来获取元素。
vector的下标操作符接受一个值,并返回vector中该对应位置的元素。vector元素的位置从0开始。
注意:下标操作不添加元素

初学C++的程序员可能会认为vector的下标操作可以添加元素,其实不然:
小例子:
vector<int> ivec;    // empty vector(空的容器)
for (vector<int>::size_type ix = 0; ix != 10; ++ix)
     ivec[ix] = ix;  // disaster: ivec has no elements(错误,容器里面没有元素)

错误分析:
上述程序试图在ivec中插入10个新元素,元素值依次为0到9的整数。但是,这里ivec是空的vector对象,而且下标只能用于获取已存在的元素。

下面是两个典型错误:
vector<int> ivec;       // empty vector
cout << ivec[0];       // Error: ivec has no elements!

vector<int> ivec2(10); // vector with 10 elements
cout << ivec[10];       // Error: ivec has elements 0...9

上面的小例子修改一下就是对的:
for (vector<int>::size_type ix = 0; ix != ivec.size(); ++ix)
    ivec[ix] = 0;

在上例中,即使ivec为空,for循环也会正确执行。ivec为空则调用size返回0,并且for中的测试比较ix和0。第一次循环时,
由于ix本身就是0,则条件测试失败,for循环体一次也不执行。

这个循环的正确写法应该是:
for (vector<int>::size_type ix = 0; ix != 10; ++ix)
     ivec.push_back(ix);    // ok: adds new element with value ix

注意2:所以必须是已存在的元素才能用下标操作符进行索引。通过下标操作进行赋值时,不会添加任何元素。

#pragma warning (disable:4786)
#include "stdafx.h"
#include <vector>
#include <iostream>
using namespace std;

#pragma pack(1)   //字节对齐,按照一个字节对齐
typedef struct digstruct
{
int a;
char b;
int m;
}mystruct;


vector<mystruct> m_mystruct;    //vector 里面是类型 结构体类型;  m_mystruct 是 容器对象 ;容器对象有很多方法,比如push_back()
                                //但是push_back()里面就必须是mystruct的实例了,想想int的实例是1、2、3......

int main(int argc, char* argv[])
{
 mystruct st_mystruct1;      //st_mystruct1 是结构体实例;
 mystruct st_mystruct2;
//    cout<<sizeof(st_mystruct)<<endl;    //字节对齐之后,sizeof 结构体对象的值是 9,按照一个字节对齐;
 st_mystruct1.a = 3;
 st_mystruct1.b = 'A';
 st_mystruct1.m = 200;
        st_mystruct2.a = 6;
 st_mystruct2.b = 'B';
 st_mystruct2.m = 400;
 m_mystruct.push_back(st_mystruct1);

/* vector容器类型是一个结构体,push_back()必须是一个结构体变量,首先对结构体变量的成员赋值,然后push_back(),最后求容器对象的size,得到是1;
*/

 m_mystruct.push_back(st_mystruct2);

/*

push_back进去两个结构体变量,然后用迭代器进行遍历,在循环里面保存结构体每个元素的值;打印出来,是先打印先push进去的值,然后是后面push进去的值;因为每次push_back  都是从容器后面push_back 进去,但是遍历的时候是从前面开始遍历;

*/
 //cout<<m_mystruct.size()<<endl;        //此时size 是2;
//      cout<<m_mystruct.back()<<endl;
 vector <int> myint(10,5);        //容器包含10个值为5的int类型的元素
        vector <int> myint;    
 myint.push_back(5);
 
 cout<<myint[0]<<endl;            //元素的下标操作;必须先有上面一步的myint.push_back(5);才能进行下标操作myint[0],找到容器中的第一个元素;
 cout<<myint.size()<<endl;
 cout<<*(myint.begin())<<endl;    //原来myint.begin()返回指向第一个元素的指针;*(myint.begin())就是指针对应的值;
                                                     //迭代器类型可使用解引用操作符(*操作符)来访问迭代器所指向的元素:
 //解引用操作符返回迭代器当前所指向的元素。假设iter指向vector对象ivec的第一个元素,那么*iter和ivec[0]就是指向同一个元素。
 //vector <int>::iterator mi;

 for ( vector<mystruct>::iterator i = m_mystruct.begin(); i != m_mystruct.end(); i++)
 {
  int a = (*i).a;
          char b = (*i).b;
  int m = (*i).m;
  //cout<<a<<"  "<<m<<endl;
 } 
 return 0;
}

#pragma pack(pop)


原创粉丝点击