标准数组 : 向量 (vector),一个类模板
内置数组类型 int fibon[];
基于对象设计的数组类: class Array{};
vector与前两者的区别:
1. 动态增长:支持向现有的数组元素赋值,以及插入元素
2. 更广泛:不在提供巨大的“可用于适量向量”的成员操作集,而只是提供了一个最小集:如等于、小于操作符、size()、empty()等操作。而一些通用的操作如sort()、min() 、max() 、find()等则是作为独立的泛型算法被提供。
vector定义的源代码:
1. vector的初始化
//创建vector的各种方法
vector<int> vec0; //空的vector
const int size = 8;
const int value = 1024;
//size为8,每个元素都为0
vector<int> vec1(size);
//size为8,每个元素都为1024
vector<int> vec2(size,value);
//vec3的size为4
int ia[4] = {0,1,2,3};
vector<int> vec3(ia,ia+4);
//vec4是vec2的拷贝
vector<int> vec4(vec2);
vec是类模板vector的一个模板,其参数是泛型的,可以是一个int表示size,可以是两个int,表示size和初始值,也可以是两个地址,表示首尾及其中的元素,还可以是vector自身~
2. 向量遍历的两种方法
extern int getSize() {return 5;}
int main(){
int size = getSize();
vector<int> vec(size);
for(int ix=0; ix<size; ++ix)
{
vec[ix] = ix;
}
return 0;
}
//使用迭代器对 iterator pair来标记向量的起始处和结束处
extern int getSize() {return 5;}
void mumble()
{
int size = getSize();
vector<int> vec(size);
vector<int>::iterator iter = vec.begin(); //类域操作符???
for(int ix=0; iter!=vec.end();++iter,++ix)
*iter = ix;
}
iter的定义:
vector::iterator iter = vec.begin();
将其初始值指向vec的第一个元素。iterator 是vector类模板中用typedef定义的类型,而这里的vector类实例包含int类型的元素。
3. 能应用到向量上的操作,独立的泛型算法集:
• 搜索算法:find(), find_if(), search(), binary_search(), count(), count_if()
• 分类排序(sorting)和通用排序(ording)算法: sort(), partial_sort(), merge(), partition(), rotate(), reverse(), random_shuffle()
• 删除(deletion)算法:unique(), remove()
• 算术算法: accumulate(), partial_sum(), inner_product(), adject_difference()
• 生成(generate)和变异(mutation)算法:generate(), fill(), transformation(), copy(), for_each()
• 关系(relational)算法:equal(), min(), max()
怎么将泛型算法应用到vector类对象上:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
//class object:
int ia[10] = { 42,24,12,54,86,45,64,66,44,32 };
int main()
{
vector<int> vec(ia, ia + 10); //ia表示地址吗?C里面是的。。
cout << ia << '\n' << ia + 9 << endl; //是的没错,是地址~~
cout << *ia << endl;
cout << *(ia + 9) << endl;
cout << *(ia + 10) << endl; // 0
cout << *(ia + 11) << endl; // 0 厉害了~
//排序数组
sort(vec.begin(), vec.end());
vector<int>::iterator iter = vec.begin();
for (int ix = 0; iter != vec.end(); iter++, ix++)
cout << vec[ix] << ' ';
cout << endl;
//获取值
int search_value;
cin >> search_value;
//搜索元素
vector<int>::iterator found; //定义迭代器found
found = find(vec.begin(), vec.end(), search_value);
if (found != vec.end())
cout << "search_value found!\n";
else cout << "search_value not found!\n";
//反转数组
reverse(vec.begin(), vec.end());
return 0;
}
运行结果:
这里奇怪的是地址0-9只相差了24.。。。不应该是40吗???
begin()源代码:
所以返回的是地址??
4. C++prime 课后作业:
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
string pals[] = { "pooh","tigger","piglet","eeyore", "kanga" };
int main() {
vector<string> svec1(pals, pals + 5);
vector<string>::iterator iter = svec1.begin();
for (int ix = 0; iter != svec1.end(); iter++, ix++){
cout << svec1[ix] << ' ';
cout << svec1[ix][5] << endl; //字符串数组里面的每个元素也是一个字符数组,最后一位是空
}
cout << endl;
}
运行结果:
svec1[ix] != svec1.end()
这种写法是不对的。。暂时也不知道为啥。。
练习 2.23
#include<string>
using namespace std;
string pals[] = { "pooh","tigger","piglet","eeyore", "kanga" };
int main() {
vector<string> svec1(pals, pals + 5);
// vector<string>::iterator iter = svec1.begin();
for (int ix = 0; ix < svec1.size(); ix++){ //不用迭代这么写也是可以的
cout << svec1[ix] << ' ';
cout << svec1[ix][5] << endl;
}
cout << endl;
}
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
template <class elemType>
elemType min(const vector<elemType> &vec) //这里的vec是指针?指向vector类模板的指针
{
elemType minimum;
if (vec.size() >= 1)
minimum = vec[0];
else
throw "empty vector -index";
for (int i = 0; i < vec.size(); i++)
if (vec[i] < minimum)
minimum = vec[i];
return minimum;
}
template <typename elemType>
elemType min2(const vector<elemType> &vec)
{
typename vector<elemType>::const_iterator iter = vec.begin(); //typename不加会报错
// cout << iter << endl;
elemType minimum;
if (iter < vec.end())
minimum = *iter;
else
throw "empty vector -index";
for (; iter < vec.end(); iter++)
if (*iter < minimum)
minimum = *iter;
return minimum;
}
int main()
{
int array[] = { 9,5,34,2,67,3,11,4,89,13 };
vector<int> a(array, array + 10);
cout << min(a) << endl;
cout << min2(a) << endl;
// vector<int> c; //空向量
// try {
// cout << min(c) << endl;
// cout << min2(c) << endl;
// }
// catch (char*s) {
// cerr << "Exception:" << s << endl;
// }
return 0;
}
关于typename,之后在深入研究吧~~看点别的
http://www.cnblogs.com/balingybj/p/4782607.html