首页 > 代码库 > Vector示例一,二

Vector示例一,二

#include <iostream>

int main(void)

{

double a[] = {1, 2, 3, 4, 5};

std::cout<<mean(a, 5)<<std::endl; // will print 3

return 0;

}

//vector

#include <vector>

#include <iostream>

int main()

{

std::vector<double> a;

a.push_back(1);

a.push_back(2);

a.push_back(3);

a.push_back(4);

a.push_back(5);

for(int i = 0; i < a.size(); ++i)

{

std::cout<<a[i]<<std::endl;

}

return 0;

}

#include <vector>

#include <iostream>

int main()

{

std::vector< int > q;

q.push_back(10);

q.push_back(11);

q.push_back(12);

std::vector< int > v;

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

v.push_back(i);

}

std::vector<int>::iterator it = v.begin() + 1;

it = v.insert(it, 33);

v.insert(it, q.begin(), q.end());

it = v.begin() + 3;

v.insert(it, 3, -1);

it = v.begin() + 4;

v.erase(it);

it = v.begin() + 1;

v.erase(it, it + 4);

v.clear();

return 0;

}

//程序:vector演示一

//目的:理解STL中的向量

// i nclude "stdafx.h" -如果你使用预编译的头文件就包含这个头文件

i nclude <vector> // STL向量的头文件。这里没有".h"

i nclude <iostream> // 包含cout对象的头文件。

using namespace std; //保证在程序中可以使用std命名空间中的成员。

char* szHW = "Hello World";

//这是一个字符数组,以"\0"结束。

int main(int argc, char* argv[])

{

vector <char> vec; //声明一个字符向量vector (STL中的数组)

//为字符数组定义一个游标iterator

vector <char>::iterator vi;

//初始化字符向量,对整个字符串进行循环,

//用来把数据填放到字符向量中,直到遇到"\0"时结束。

char* cptr = szHW; // 将一个指针指向"Hello World"字符串

while (*cptr != ‘\0‘)

{ vec.push_back(*cptr); cptr++; }

// push_back函数将数据放在向量的尾部。

// 将向量中的字符一个个地显示在控制台

for (vi=vec.begin(); vi!=vec.end(); vi++)

// 这是STL循环的规范化的开始——通常是 "!=" 而不是 "<"

// 因为"<" 在一些容器中没有定义。

// begin()返回向量起始元素的游标(iterator),end()返回向量末尾元素的游标(iterator)。

{ cout << *vi; } // 使用运算符"*"将数据从游标指针中提取出来。

cout << endl; // 换行

return 0;

}

 

//程序:初始化演示

//目的:为了说明STL中的向量是怎样初始化的。

i nclude <cstring> // <cstring><string.h>相同

i nclude <vector>

using namespace std;

int ar[10] = { 12, 45, 234, 64, 12, 35, 63, 23, 12, 55 };

char* str = "Hello World";

int main(int argc, char* argv[])

{

vector <int> vec1(ar, ar+10);

vector <char> vec2(str, str+strlen(str));

return 0;

}

 

//程序:vector演示二

//目的:理解带有数组下标和方括号的STL向量

i nclude <cstring>

i nclude <vector>

i nclude <iostream>

using namespace std;

char* szHW = "Hello World";

int main(int argc, char* argv[])

{

vector <char> vec(strlen(szHW)); //为向量分配内存空间

int i, k = 0;

char* cptr = szHW;

while (*cptr != ‘\0‘)

{ vec[k] = *cptr; cptr++; k++; }

for (i=0; i<vec.size(); i++)

{ cout << vec[i]; }

cout << endl;

return 0;

}

//set

/*这是微软帮助文档中对集合(set)的解释:"描述了一个控制变长元素序列的对象(注:set中的keyvalueKey类型的,而map中的keyvalue是一个pair结构中的两个分量)的模板类,每一个元素包含了一个排序键(sort key)和一个值(value)。对这个序列可以进行查找、插入、删除序列中的任意一个元素,而完成这些操作的时间同这个序列中元素个数的对数成比例关系,并且当游标指向一个已删除的元素时,删除操作无效。"

而一个经过更正的和更加实际的定义应该是:一个集合(set)是一个容器,它其中所包含的元素的值是唯一的。这在收集一个数据的具体值的时候是有用的。集合中的元素按一定的顺序排列,并被作为集合中的实例。如果你需要一个键/值对(pair)来存储数据,map是一个更好的选择。一个集合通过一个链表来组织,在插入操作和删除操作上比向量(vector)快,但查找或添加末尾的元素时会有些慢。

下面是一个例子:

*/

//程序:set演示

//目的:理解STL中的集合(set

i nclude <string>

i nclude <set>

i nclude <iostream>

using namespace std;

int main(int argc, char* argv[])

{

set <string> strset;

set <string>::iterator si;

strset.insert("cantaloupes");

strset.insert("apple");

strset.insert("orange");

strset.insert("banana");

strset.insert("grapes");

strset.insert("grapes");

for (si=strset.begin(); si!=strset.end(); si++)

{ cout << *si << " "; }

cout << endl;

return 0;

}

// 输出: apple banana cantaloupes grapes orange

//注意:输出的集合中的元素是按字母大小顺序排列的,而且每个值都不重复。

 

//如果你感兴趣的话,你可以将输出循环用下面的代码替换:

copy(strset.begin(), strset.end(), ostream_iterator<string>(cout, " "));

//map

//程序:映射自定义的类。

//目的:说明在map中怎样使用自定义的类。

i nclude <string>

i nclude <iostream>

i nclude <vector>

i nclude <map>

using namespace std;

class CStudent

{

public :

int nStudentID;

int nAge;

public :

//缺省构造函数——通常为空

CStudent() { }

// 完整的构造函数

CStudent(int nSID, int nA) { nStudentID=nSID; nAge=nA; }

//拷贝构造函数

CStudent(const CStudent& ob)

{ nStudentID=ob.nStudentID; nAge=ob.nAge; }

// 重载"="

void operator = (const CStudent& ob)

{ nStudentID=ob.nStudentID; nAge=ob.nAge; }

};

int main(int argc, char* argv[])

{

map <string, CStudent> mapStudent;

mapStudent["Joe Lennon"] = CStudent(103547, 22);

mapStudent["Phil McCartney"] = CStudent(100723, 22);

mapStudent["Raoul Starr"] = CStudent(107350, 24);

mapStudent["Gordon Hamilton"] = CStudent(102330, 22);

// 通过姓名来访问Cstudent类中的成员

cout << "The Student number for Joe Lennon is " <<

(mapStudent["Joe Lennon"].nStudentID) << endl;

return 0;

}

//Algorithms

sort(vec.begin()+1, vec.end()-1)可以实现对除第一个和最后一个元素的其他元素的排序操作。

//程序:测试分数统计

//目的:通过对向量中保存的分数的操作说明怎样使用算法

i nclude <algorithm> //如果要使用算法函数,你必须要包含这个头文件。

i nclude <numeric> // 包含accumulate(求和)函数的头文件

i nclude <vector>

i nclude <iostream>

using namespace std;

int testscore[] = {67, 56, 24, 78, 99, 87, 56};

//判断一个成绩是否通过了考试

bool passed_test(int n)

{

return (n >= 60);

}

// 判断一个成绩是否不及格

bool failed_test(int n)

{

return (n < 60);

}

int main(int argc, char* argv[])

{

int total;

// 初始化向量,使之能够装入testscore数组中的元素

vector <int> vecTestScore(testscore,

testscore + sizeof(testscore) / sizeof(int));

vector <int>::iterator vi;

// 排序并显示向量中的数据

sort(vecTestScore.begin(), vecTestScore.end());

cout << "Sorted Test Scores:" << endl;

for (vi=vecTestScore.begin(); vi != vecTestScore.end(); vi++)

{ cout << *vi << ", "; }

cout << endl;

// 显示统计信息

// min_element 返回一个 _iterator_ 类型的对象,该对象指向值最小的那个元素。

//"*"运算符提取元素中的值。

vi = min_element(vecTestScore.begin(), vecTestScore.end());

cout << "The lowest score was " << *vi << "." << endl;

//min_element类似,max_element是选出最大值。

vi = max_element(vecTestScore.begin(), vecTestScore.end());

cout << "The highest score was " << *vi << "." << endl;

// 使用声明函数(predicate function,指vecTestScore.begin()vecTestScore.end())来确定通过考试的人数。

cout << count_if(vecTestScore.begin(), vecTestScore.end(), passed_test) <<

" out of " << vecTestScore.size() <<

" students passed the test" << endl;

// 确定有多少人考试挂了

cout << count_if(vecTestScore.begin(),

vecTestScore.end(), failed_test) <<

" out of " << vecTestScore.size() <<

" students failed the test" << endl;

//计算成绩总和

total = accumulate(vecTestScore.begin(),

vecTestScore.end(), 0);

// 计算显示平均成绩

cout << "Average score was " <<

(total / (int)(vecTestScore.size())) << endl;

return 0;

}

一些建议

为了避免在调试模式(debug mode)出现恼人的警告,使用下面的编译器命令:

#pragma warning(disable: 4786)

另一条需要注意的是,你必须确保在两个尖括号之间或尖括号和名字之间用空格隔开,因为是为了避免同">>"移位运算符混淆。比如

vector <list<int>> veclis;

这样写会报错,而这样写:

vector <list <int> > veclis;

就可以避免错误。

Vector示例一,二