1.1数组

1.1.2数组的知识点

c++中的数组vector

vector<int> v1

vector<int> v2(10)

vector<int> v3(10,1.25)

vector<vector<int>> v4

vector<vector<int>>v5(3,vector<int>(5,0))

v1.capacity()

v1.resize(n)调整向量的容器,使其恰好容纳n个元素,增加部分用默认值填充

v1.empty()

v1.size()

v1.front()返回向量的首元素

v1.back()返回向量的尾元素

v1.push_back()

v1.insert(pos,e)在向量的pos位置添加e

v1.erase() 删除向量中某个迭代器或迭代器区间指定的元素

v1.clear()

v1.begin()/v1.end() -----[   )

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#include<vector>
#include<iterator>
int main() {
    vector<int> a;
    a.resize(3);
    a[1] = 2;
    a.push_back(3);
    a.insert(a.begin(), 1);
    a.push_back(4);
    for (vector<int>::iterator it = a.begin(); it != a.end(); it++) {

//auto it = a.begin(); // 类型自动推导为 std::vector<int>::iterator,auto是类型自动推导
        cout << *it << endl;
    }
    return 0;
}

 sort

vector<int> v={1,5,4,3,2,7};

sort(v.begin(),v.end(),less<int>);//递增

sort(v.begin(),v.end(),greater<int>);//递减

整体建表法

指一次性建立数组中的全部元素,然后添加在末尾添加O(1)

如:定一个整数数组a,返回包含a的奇数元素

vector<int> getodd(vector<int> &a){

        vector<int> ans;

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

                if(a[i]%==1){

                        ans.push_back(a[i]);

                }

        }

        return ans;

}

基本二路归并法 

给定两个递增数组a和b,将所有元素递增的存入c数组中

vector<int>merge(vector<int>& a, vector<int>& b) {
	int len1 = a.size();
	int len2 = b.size();
	int i = j = 0;
	vector<int> c;
	while (i < len1 &&  j < len2) {
		if (i < j) {
			c.push_back(a[i]);
			i++;
		}
		else {
			c.push_back(b[j]);
			j++;
		}
	}
	while (i < len1) {
		c.push_back(a[i]);
		i++;
	}
	while (J < len2) {
		c.push_back(b[j]);
		j++;
	}
	return c;
}

二路归并的扩展应用

//求交集
vector<int> intersect(vector<int>& a, vector<int>& b) {
	vector<int> c;
	int len1 = a.size();
	int len2 = b.size();
	int i =0, j = 0;
	while (i < len1 && j < len2) {
		if (a[i] < b[j]) i++;
		else if (a[i] > b[j])j++;
		else {
			c.push_back(a[i]);
			i++;
			j++;
		}
	}return c;
}
//求差集a-b
vector<int> difference(vector<int>& a, vector<int>& b) {
	vector<int> c;
	int len1 = a.size();
	int len2 = b.size();
	int i = 0, j = 0;
	while (i < len1 && j < len2) {
		if (a[i] < b[j]) {
			c.push_back(a[i]);
			i++;
		}
		else if(a[i]>b[j]){
			j++;
		}
		else {
			i++; j++;
		}
	}
	while (i < len1) {
		c.push_back(a[i]);
		i++;
	}
	return c;
}
//3.归并结果除重
vector<int> uniquemerge(vector<int>& a, vector<int>& b) {
	vector<int> c;
	int len1 = a.size();
	int len2 = b.size();
	int i = 0, j = 0;
	while (i < len1 && j < len2) {
		if (a[i] < b[j]) {
			if (c.empty() || a[i] != c.back()) c.push_back(a[i]);
			i++;
		}
		else {
			if (c.empty() || b[j] != c.back()) c.push_back(b[j]);
			j++;
		}
	}
	while (i < len1) {
		if (c.empty() || a[i] != c.back()) c.push_back(a[i]);
		i++;
	}
	while (j < len2) {
		if (c.empty() || b[j] != c.back())c.push_back(b[j]);
		j++;
	}
	return c;
}

多路归并法 

//x数组存的是每个归并段的第一个元素
int minik(vector<int>& x) {
    int mini = 0;
    for (int i = 0; i < x.size(); i++) {
        if (x[i] < x[mini]) {
            mini = i;
        }
    }
    if (x[mini] == 10086) {
        return -1;
    }
    else {
        return mini;
    }
}
//p[i]代表第i个归并段的下表标
vector<int> mergek(vector<vector<int>>& a) {
    int k = a.size();
    vector<int> p(k), x(k);
    for (int i = 1; i < k; i++) {
        p[i] = 0;
        x[i] = a[i][p[i]];
    }
    vector<int>c;
    while (true) {
        int mini = minik(x);
        if (mini == -1) break;
        c.push_back(a[mini][p[mini]]);
        p[mini]++;
        if (p[mini] >= a[mini].size()) {
            x[mini] = 10086;
        }
        else {
            x[mini] = a[mini][p[mini]];//从x取出最小的存入a后,就近原则将后一个存入x[mini]
        }
    }
    return c;
}

0/1 1.1-采用数组实现图书浏览/1.1-采用数组实现图书浏览.cpp: In function ‘void Print(SqList&)’: 1.1-采用数组实现图书浏览/1.1-采用数组实现图书浏览.cpp:8:2: error: ‘cout’ was not declared in this scope cout << "北京林业大学图书馆计算机类图书采购列表" << endl; ^~~~ 1.1-采用数组实现图书浏览/1.1-采用数组实现图书浏览.cpp:8:73: error: ‘endl’ was not declared in this scope cout << "北京林业大学图书馆计算机类图书采购列表" << endl; ^~~~ 1.1-采用数组实现图书浏览/1.1-采用数组实现图书浏览.cpp:8:73: note: suggested alternative: ‘enum’ cout << "北京林业大学图书馆计算机类图书采购列表" << endl; ^~~~ enum 1.1-采用数组实现图书浏览/1.1-采用数组实现图书浏览.cpp: In function ‘int main()’: 1.1-采用数组实现图书浏览/1.1-采用数组实现图书浏览.cpp:18:5: error: redefinition of ‘int main()’ int main(){ ^~~~ In file included from 1.1-采用数组实现图书浏览/1.1-采用数组实现图书浏览.cpp:1:0: 1.1-采用数组实现图书浏览/1.1.h:69:5: note: ‘int main()’ previously defined here int main() { ^~~~ 1.1-采用数组实现图书浏览/1.1-采用数组实现图书浏览.cpp:20:2: error: ‘string’ was not declared in this scope string filepath = "/data/workspace/myshixun/book.txt"; ^~~~~~ 1.1-采用数组实现图书浏览/1.1-采用数组实现图书浏览.cpp:20:2: note: suggested alternative: ‘stdin’ string filepath = "/data/workspace/myshixun/book.txt"; ^~~~~~ stdin 1.1-采用数组实现图书浏览/1.1-采用数组实现图书浏览.cpp:21:12: error: cannot convert ‘SqList’ to ‘SqList*’ for argument ‘1’ to ‘void InitList(SqList*)’ InitList(L); ^ 1.1-采用数组实现图书浏览/1.1-采用数组实现图书浏览.cpp:22:14: error: ‘filepath’ was not declared in this scope ReadFile(L, filepath); //读取文件 ^~~~~~~~ 1.1-采用数组实现图书浏览/1.1-采用数组实现图书浏览.cpp:22:14: note: suggested alternative: ‘realpath’ ReadFile(L, filepath); //读取文件 ^~~~~~~~ realpath 1.1-采用数组实现图书浏览/1.1-采用数组实现图书浏览.cpp:24:12: error: cannot convert ‘SqList’ to ‘SqList*’ for argument ‘1’ to ‘void FreeList(SqList*)’ FreeList(L); ^
09-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值