C++ vector

标准数组 : 向量 (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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值