c++学习笔记之数组及vector

简介: 1、初始化int n[10] = {1}  当初始化值比数组元素少的时候,剩下的元素被初始化为0。int n[2] = {1, 2, 3} 当初始值比数组元素多的时候,编译时会报错。static int n[10]  不必进行初始化,static数组会自动初始化元素。

1、初始化


int n[10] = {1}  当初始化值比数组元素少的时候,剩下的元素被初始化为0。

int n[2] = {1, 2, 3} 当初始值比数组元素多的时候,编译时会报错。

static int n[10]  不必进行初始化,static数组会自动初始化元素。


2、声明数组


只能使用常量来声明数组,否则会产生编译错误。如:

int a = 10;

int n[a];

这样就会产生编译错误。

int a = 10;

const int i = a;

int n[i];

这样虽然i是用const修饰,但是赋值给他的a依然是一个变量,所以一样会产生编译错误。


尤其注意函数的传参,用传参来声明数组会产生编译错误。

const int i = 10;

int n[i];

这样就不会产生编译错误。


3、数组越界


与Java不同,在c++中数组越界不会报错,编译通过也可以正常运行,会得到一个默认值。但是数组越界是很严重的。

双向越界都不会报错,也就是说下标为负值也不会报错。


4、数组赋值


数组是不能直接赋值的。如:

int n[1] = {0};

int m[1] = {0};

n = m;


这样就好编译错误

由于数组名是const指针,所以一个数组不能通过赋值运算赋给另一个数组。(常量指针不能用在赋值运算左侧)


5、数组/vector长度


(1)与java不同,数组不能知道自身的长度。所以把一个数组当函数传参时,也要把数组长度当函数传参才行。如:

void init(int nums[], int length)


(2)vector.size()是一个size_t类型的,不是int类型,一定要注意。在某些编译器上直接转int会报错。


6、vector初始化及赋值


(1)vector初始化可以传入另外一个vector2,这样会拷贝vector2的数据来初始化,称为拷贝构造函数。如:

vector a;

vector b(a);


(2)将一个vector赋值给另外一个vector时,也是拷贝。

a = b;     //a是b的拷贝,依然是两个不同的vector。

注意当两个vector不同时进行赋值,左侧的vector无论之前什么长度,都会变成跟右侧vector长度相等,元素相等。


7、vector获取元素


可以用vector[i]或vector.at(i)两种形式来获取元素。其中第一种方式与数组一样不检查边界,而第二种方式会检查边界。


8、函数传参


数组作为函数传参时是引用参数,如void init(int a[])

vector作为函数传参时默认是传值的,所以如果想引用传参,必须加“&”,如void init(vector &a)。

所以使用vector函数传参时一定要注意,尽量使用引用传参,以免不必要的内存占用。


9、字符串数组


可以直接使用字符串初始化,如:

char a[] = "abcd";

数组长度会比字符串长度大1,因为数组末尾有一个‘\0’,来表示这个数组是一个字符串,如果没有这个结尾,那只是一个普通的数组。

比如上面的数组a应该是[‘a’, 'b', 'c', 'd', '\0']的一个长度为5的数组。

可以直接使用,如 cout<<a<<endl 可以直接打印字符串

所以一定要注意长度,如果保存超过声明长度的字符串,数组末尾就没有'\0'字符,而且会覆盖内存中数组后面的数据,造成溢出。


10、多维数组初始化


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

会按照顺序(先行后列)为多维数组初始化,不够的初始化为0。既a[0][0]=1, a[0][1]=2 ... a[1][2]=0

int a[2][3] = {{1}, {2, 3}}    

会按每行进行初始化,不够的初始化为0。既a[0][0]=1, a[0][1]=0, a[0][2]=0, a[,1][0]=2, a[1][1]=3, a[1][2]=0

int a[2][1] = {{1}, {2, 3}}

这样会编译报错,因为每行只有一列,而{2, 3}超出了。同样int a[1][2] = {{1, 2}, {1}}也是

int a[][2] = {{1}, {2, 3}}

可以没有行数,这样会根据初始化的值自动判断出行数,但是一定要有列数。


11、vector排序


std::sort(vector.begin(), vector.end());


目录
相关文章
|
3月前
|
搜索推荐 编译器 C语言
【C++核心】特殊的元素集合-数组与字符串详解
这篇文章详细讲解了C++中数组和字符串的基本概念、操作和应用,包括一维数组、二维数组的定义和使用,以及C风格字符串和C++字符串类的对比。
95 4
|
19天前
|
存储 编译器 C语言
【c++丨STL】vector的使用
本文介绍了C++ STL中的`vector`容器,包括其基本概念、主要接口及其使用方法。`vector`是一种动态数组,能够根据需要自动调整大小,提供了丰富的操作接口,如增删查改等。文章详细解释了`vector`的构造函数、赋值运算符、容量接口、迭代器接口、元素访问接口以及一些常用的增删操作函数。最后,还展示了如何使用`vector`创建字符串数组,体现了`vector`在实际编程中的灵活性和实用性。
45 4
|
1天前
|
存储 对象存储 C++
C++ 中 std::array<int, array_size> 与 std::vector<int> 的深入对比
本文深入对比了 C++ 标准库中的 `std::array` 和 `std::vector`,从内存管理、性能、功能特性、使用场景等方面详细分析了两者的差异。`std::array` 适合固定大小的数据和高性能需求,而 `std::vector` 则提供了动态调整大小的灵活性,适用于数据量不确定或需要频繁操作的场景。选择合适的容器可以提高代码的效率和可靠性。
9 0
|
5天前
|
存储 编译器 C语言
【c++丨STL】vector模拟实现
本文深入探讨了 `vector` 的底层实现原理,并尝试模拟实现其结构及常用接口。首先介绍了 `vector` 的底层是动态顺序表,使用三个迭代器(指针)来维护数组,分别为 `start`、`finish` 和 `end_of_storage`。接着详细讲解了如何实现 `vector` 的各种构造函数、析构函数、容量接口、迭代器接口、插入和删除操作等。最后提供了完整的模拟实现代码,帮助读者更好地理解和掌握 `vector` 的实现细节。
17 0
|
2月前
|
存储 C++ 索引
【C++打怪之路Lv9】-- vector
【C++打怪之路Lv9】-- vector
25 1
|
2月前
|
安全 测试技术 C++
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化2
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化
70 6
|
2月前
|
安全 测试技术 C++
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化1
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化
75 7
|
2月前
|
编译器 C++
【C++】—— vector模拟实现
【C++】—— vector模拟实现
|
2月前
|
编译器 C语言 C++
【C++篇】解密 STL 动态之魂:全面掌握 C++ vector 的高效与优雅
【C++篇】解密 STL 动态之魂:全面掌握 C++ vector 的高效与优雅
54 3
|
2月前
|
C++
【C++】C++ STL探索:Vector使用与背后底层逻辑(三)
【C++】C++ STL探索:Vector使用与背后底层逻辑