C++用vector实现的一维二维数组的使用

C++ STL库中的vector类似于封装了一个动态的数组,非常的好用,关于vector的一些函数,见这篇博客:
https://blog.csdn.net/wuzhongqiang/article/details/102956793
而这里,结合刷题过程中的学习,对知识进行一些补充和梳理。
首先是一维数组的创建,一维数组可以直接创建,也可以通过数组的方式创建

int arr[] = {1, 2, 3, 4, 5}
int len = sizeof(arr) / sizeof(arr[0]);
vector<int> v(arr, arr+len)  // 利用vector的构造函数,由普通数组直接创建向量

下面主要记录二维数组
今天刷了LeetCode上的一个有效数独的题目,发现用vector实现二维数组的方式比较好用,所以在这里整理一下,vector如何创建二维数组和创建完了怎么使用。

1. vector创建二维数组和添加元素的方式1

  • 创建二维数组
vector<vector<char> > v;    // 这是一种方式,注意<char>后面有个空格
  • 添加元素
    上面的这种方式,如果需要进行使用的话,一般得用push_back往里面加入元素。 但是注意v.push_back() 这里面必须是个向量,别的不行。
    可以下面这样添加元素:
//正确的插入方式
vector<vector<int> > A;
//A.push_back里必须是vector
vector<int> B;
B.push_back(0);
B.push_back(1);
B.push_back(2);
A.push_back(B);
B.clear();
B.push_back(3);
B.push_back(4);
B.push_back(5);
A.push_back(B);

或者用循环

vector<vector<int> > test;
vector<int> v;
int n,temp;
 
cin >> n;
test.clear();
 
 //输入
for (int i = 0; i<n; i++) {
   v.clear(); //每次记得clear:)
   for (int j = 0; j < n; j++)
    {
        cin >> temp;
        v.push_back(temp);
     }
        test.push_back(v);
    }

2. vector创建二维数组和添加元素的方式2

  • 创建数组
    第二种创建数组的方式就是创建的时候直接定义好二维数组的结构(多少行,多少列)
//创建一个5行3列的数组
//由vector实现的二维数组,可以通过resize()的形式改变行、列值
int i,j;
vector<vector<int>> array(5);
for (i = 0; i < array.size(); i++)
    array[i].resize(3);

// 赋值
for(i = 0; i < array.size(); i++)
{
    for (j = 0; j < array[0].size();j++)
    {
        array[i][j] = (i+1)*(j+1);
    }
}

或者

vector<vector<char> > v(5, vector<char>(3)) // 创建了一个5行3列的数组
vector<vector<char> > v(5, vector<char>(3, 1)) // 创建一个5行3列的数组,并且初始化元素全为1

3. 二维数组的遍历

创建完了之后,如何像普通的二维数组那样遍历呢?

  • 第一种遍历方式,类似普通的二维数组,获取行数和列数,然后遍历
void reverse_with_index(vector<vector<int>> vec)
{
    if (vec.empty())
    {
        cout << "The vector is empty!" << endl;
        return;
    }

    int i,j;
    cout << "Use index : " << endl;
    for (i = 0; i < vec.size(); i++)
    {
        for(j = 0; j < vec[0].size(); j++)
            cout << vec[i][j] << " ";
        cout << endl;
    }
}

其中, vec.size() 这是行数, vec[0].size() 这是列数

  • 第二种方式,迭代器
void reverse_with_iterator(vector<vector<int>> vec)
{
    if (vec.empty())
    {
        cout << "The vector is empty!" << endl;
        return;
    }

    vector<int>::iterator it;
    vector<vector<int>>::iterator iter;
    vector<int> vec_tmp;

    cout << "Use iterator : " << endl;
    for(iter = vec.begin(); iter != vec.end(); iter++)
    {
        vec_tmp = *iter;
        for(it = vec_tmp.begin(); it != vec_tmp.end(); it++)
            cout << *it << " ";
        cout << endl;
    }
}

小总

其实,理解了vector的一维应用,再理解vector的二维应用应该是比较简单了,无非就是把一维数组里面的int, char等换成了又一个向量, 一些方法还是通用的。
PS: vector里面常用的一些方法:

vector是一个模板类 所以使用时要用vector a 或者 vector b这样的方式来声明一个vector
vector是一个类似于int a[]的整数数组,而vector是一个类似于string a[]的字符串数组
clear()清空
resize()改变大小
push_back()在尾部添加元素
pop_back()在尾部删除元素
empty()测试是否为空
vector之间可以直接赋值或者作为函数的返回值
push_back()和pop_back()无需改变数组长度,自动会增加和减小数组长度
增加长度后增加的元素值为0

测试代码:

#include <iostream>
#include <vector>
using namespace std; 
int main() 
	vector<int> a; 
	int t; 
	for (int i = 0; i < 10; i++) 
	{ 
		cin >> t; a.push_back(t); 
	} 
	vector<int> b; 
	b = a; 
	cout << "print b: 直接赋值" << endl; 
	for (int i = 0; i < b.size(); i++) 
	{ 
		cout << b[i] << " "; 
	} 
	cout << endl; 
	cout << "a.size() = " << a.size() << endl;  
	cout << "print1:" << endl; 
	for (int i = 0; i < a.size(); i++) 
	{ 
		cout << a[i] << " "; 
	} 
	cout << endl;  
	a.resize(11); 
	cout << "a.size() = after resize(11) :" << a.size() << endl; 		 
	cout << "print2 after resize(11):" << endl; 
	for (int i = 0; i < a.size(); i++) 
	{ 
		cout << a[i] << " "; 
	} 
	cout << endl;  
	a.push_back(22); 
	cout << "print3 after push_back(22):" << endl; 
	for (int i = 0; i < a.size(); i++) 
	{ 
	    cout << a[i] << " "; 
	 } 
	 cout << endl;  
	 a.pop_back(); 
	 cout << "a.size() = after pop_back() :" << a.size() << endl; 
	 cout << "print4 after pop_back():" << endl; 
	 for (int i = 0; i < a.size(); i++) 
	 { 
	 	cout << a[i] << " "; 
	 } 
	 cout << endl; 
	 cout << "a.empty()?:" << a.empty() << endl; 
	 a.clear(); 
	 cout << "a.size() = after a.clear() :" << a.size() << endl; 
	 cout << "print5 after a.clear():" << endl; 
	 for (int i = 0; i < a.size(); i++) 
	 { 
	 	cout << a[i] << " "; 
	 } 
	 cout << endl; 
return 0;
}

STL中vector的方法:

c.assign(beg,end) 将(beg; end)区间中的数据赋值给c。
c.assign(n,elem) 将n个elem的拷贝赋值给c。
c. at(idx)  传回索引idx所指的数据,如果idx越界,抛出out_of_range。
c.back()  传回最后一个数据,不检查这个数据是否存在。
c.begin()  传回迭代器中的第一个数据地址。
c.capacity()  返回容器中数据个数。
c.clear()  移除容器中所有数据。
c.empty()  判断容器是否为空。
c.end() // 指向迭代器中末端元素的下一个,指向一个不存在元素。
c.erase(pos) // 删除pos位置的数据,传回下一个数据的位置。
c.erase(beg,end) 删除[beg,end)区间的数据,传回下一个数据的位置。
c.front()    传回第一个数据。
get_allocator  使用构造函数返回一个拷贝。
c.insert(pos,elem) // 在pos位置插入一个elem拷贝,传回新数据位置
c.insert(pos,n,elem) // 在pos位置插入n个elem数据,无返回值
c.insert(pos,beg,end) // 在pos位置插入在[beg,end)区间的数据。无返回值
c.max_size()  返回容器中最大数据的数量。
c.pop_back()  删除最后一个数据。
c.push_back(elem)  在尾部加入一个数据。
c.rbegin()  传回一个逆向队列的第一个数据。
c.rend()  传回一个逆向队列的最后一个数据的下一个位置。
c.resize(num)   重新指定队列的长度。
c.reserve()  保留适当的容量。
c.size()  返回容器中实际数据的个数。
c1.swap(c2) // 将c1和c2元素互换

发布了66 篇原创文章 · 获赞 67 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/wuzhongqiang/article/details/103213734