vector 基本操作(对象、下标)
一、vector对象的操作:1、向vector添加元素push_back()操作接受一个元素值,并将它作为一个新的元素添加到vector对象的后面,也就是“插入(push)”到vector对象的“后面(back)”:小例子:vector text; // empty vector(空的容器)while (cin >> word) { text.push_back(word);
一、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)
更多推荐
所有评论(0)