每日诗词:
疏影横斜水清浅,暗香浮动月黄昏。
——《山园小梅·其一》林逋
目录
我们在学习C语言的过程中也不能忘却了汉字美,所以从这篇之后我都会附上一句或一首的古诗词供大家欣赏。
现在我们就来看看数组的基本用法(增,删,改,查)
数组的基础操作:
数组元素的增加:
对数组元素的添加有两种形式:一种是在数组的末尾添加元素:第二种是在数组序列中直接插入元素。
如上图就是直接在数组的结尾添加一个元素,这不影响整个数组,这样的处理时间最短。
这个就是第二种方式;直接在数组中间插入一个元素,这样做会影响插入之后的元素,影响较大,处理时间较长。
演示:
在C++中,固定大小的数组(静态数组)(如int arr[10];)在声明时其大小就已经确定,并且不支持直接添加元素的操作,因为数组的内存是连续分配的,并且其大小在编译时就已确定。
如果你需要动态地添加元素,你应该考虑使用动态数组,如std::vector。std::vector是一个能够自动管理存储空间的模板类,它提供了在运行时动态增加或减少元素的功能。
以下是使用std::vector添加元素的示例:
#include <vector>
#include <iostream>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5}; // 初始化为包含5个元素的vector
// 向vector末尾添加一个元素
vec.push_back(6);
// 现在vec包含6个元素
for (int num : vec) {
std::cout << num << " ";
}
// 输出:1 2 3 4 5 6
// 如果你知道要插入的位置,并且想要在那个位置插入一个新元素(而不是在末尾),
// 你可以使用insert函数。但是请注意,这会移动该位置之后的所有元素。
vec.insert(vec.begin() + 2, 3.5); // 注意:这里尝试插入一个float,但vector是int类型,这会导致编译错误
// 正确的做法是插入相同类型的元素,比如再插入一个3(如果这是你想要的)
vec.insert(vec.begin() + 2, 3);
// 现在vec包含7个元素,其中第二个3位于索引2的位置
for (int num : vec) {
std::cout << num << " ";
}
// 输出:1 2 3 3 4 5 6
return 0;
}
请注意,在上面的代码中,我尝试插入一个float类型的值到int类型的vector中,这会导致编译错误。你应该始终插入与vector元素类型相同的值。
如果你确实需要使用固定大小的数组,并且需要在不改变数组大小的情况下“添加”元素,那么你可能需要重新考虑你的数据结构或算法。一种可能的方法是使用一个足够大的数组来存储可能需要的所有元素,并在逻辑上只使用其中的一部分。然而,这种方法并不灵活,因为它要求你提前知道可能需要存储的元素的最大数量。另一种方法是使用链表或动态分配的数组(如通过new操作符),但这将需要你自己管理内存。然而,在大多数情况下,使用std::vector会是更好的选择。
对于这个vector的动态数组我会在下期内容说到。有些对于静态数组要遵守的规则,在动态数组中可以不用理会,动态数组的自由度十分的高。
数组元素的删除:
同样,数组的删除也是有两种类型
演示:
在C++中,数组(特别是固定大小的数组)本身并不支持直接删除元素的操作,因为数组的大小在声明时就确定了,且其元素在内存中是连续存储的。不过,我们可以通过一些方法来模拟“删除”操作:
1.覆盖法:将要删除的元素之后的所有元素都向前移动一位,覆盖掉要删除的元素。这样,虽然数组的大小没有变,但看起来就像是删除了那个元素。
2.使用动态数组:比如std::vector,它提供了erase成员函数来删除元素,并且可以自动调整大小。
举个例子,如果你有一个整型数组int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};,并且你想删除索引为3的元素(即值为4的元素),你可以这样做(使用覆盖法):
for (int i = 3; i < 9; i++) { // 假设数组未满,且要删除的元素不是最后一个
arr[i] = arr[i + 1];
}
// 现在arr变成了{1, 2, 3, 5, 6, 7, 8, 9, 10, 10}(最后一个元素是重复的,或者你可以将其设置为某个特殊值表示无效)
// 注意:如果数组是满的,或者要删除的是最后一个元素,这种方法需要额外处理
然而,更推荐的做法是使用std::vector,因为它提供了更灵活和安全的操作方式:
#include <vector>
#include <iostream>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
vec.erase(vec.begin() + 3); // 删除索引为3的元素
for (int num : vec) {
std::cout << num << " ";
}
// 输出:1 2 3 5 6 7 8 9 10
return 0;
}
这样,你就可以很方便地删除std::vector中的元素了。
在C++中,如果你使用的是固定大小的数组(比如int arr[10];),你不能直接“删除”数组中的最后一个元素,因为数组的大小在声明时就确定了,并且元素在内存中是连续存储的。
如果你使用的是std::vector,那么删除最后一个元素就变得非常简单了。你可以使用pop_back成员函数来移除vector的最后一个元素,并且vector会自动调整其大小。
下面是使用std::vector删除最后一个元素的示例:
#include <vector>
#include <iostream>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
// 打印删除前的vector
for (int num : vec) {
std::cout << num << " ";
}
std::cout << std::endl;
// 删除最后一个元素
vec.pop_back();
// 打印删除后的vector
for (int num : vec) {
std::cout << num << " ";
}
// 输出:1 2 3 4
return 0;
}
数组元素的访问和修改:
访问数组的元素。
有两种的访问方式:
我们可以直接用a[]的方式访问。
比如:
- 直接访问:cout<<a[2]=5<<endl;这就是对数组元素第二个的访问。
- 指针方式访问:int*p=a; *(p+2)=5;这也是访问,甚至还对第二个元素进行了改动。
演示:
#include <iostream>
int main() {
int arr[5] = {1, 2, 3, 4, 5}; // 声明并初始化一个包含5个整数的数组
// 修改索引为2的元素(即第三个元素,因为索引从0开始)
arr[2] = 10;
// 打印修改后的数组内容,以验证修改
for (int i = 0; i < 5; i++) {
std::cout << arr[i] << " ";
}
// 输出:1 2 10 4 5
return 0;
}
数组元素的查找
找到那个元素对应的下标,也可以找到下标对应的元素(就是访问)。
代码演示:
#include <iostream>
using namespace std;
int main() {
int arr[5] = {1, 2, 3, 4, 5}; // 声明并初始化一个包含5个整数的数组
int len=sizeof(arr)/sizeof(arr[]);//得到数组容量
for (int i = 0; i < len; ++i)
{
if(arr[i]==3)
return i;
}
return 0;
}
上面代码就是查找的实例,十分的简单。我们只需要用循环遍历数组就可以查找到想要的那个元素的下标。后期我们就可以利用这一基本原理写函数来计算。
🆗到这里,这篇关于C++数组的基础用法就说完了,求一个免费的赞,感谢阅读,我们下期见。