【c++11】非成员begin() 、end()

本文展示如何使用C++ STL中的begin()、end()和find()函数简化数组操作,包括遍历数组元素、查找特定元素,并将数组转换为容器。通过示例代码演示了这些功能的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream>
#include <vector>
#include <algorithm>

int _tmain(int argc, _TCHAR* argv[])
{
	// 非成员begin()\end()使数组的使用变得像std容器一般,再也不用繁琐地求数组长度了
	// 调用方式:std::begin(数组名)、std::end(数组名)
	// 返回值分别标示了数组的开始以及越界位置的“迭代器”
	int a[] = {1,3,5,7,9};
	std::for_each(std::begin(a), std::end(a), [](int n) {std::cout << n << std::endl;});
	auto pos = std::find(std::begin(a), std::end(a), 5);
	std::cout << *pos << std::endl;

	// 对于容器,也可以用此方式取代成员函数begin()\end()
	// 当然最好使用成员函数和迭代器,这里是为了测试
	std::vector<int> v(std::begin(a), std::end(a)); // v(a, a+sizeof(a)/sizeof(a[0]))
	std::for_each(std::begin(v), std::end(v), [=](const int& n) {std::cout << n << std::endl;});
	auto pos2 = std::find(std::begin(v), std::end(v), 5); // (v.begin(), v.end(), 5)
	std::cout << *pos2 << std::endl;

	return 0;
}

### C++ 中 `begin` 和 `end` 方法的使用 在C++中,`begin()`和`end()`用于获取指向序列起始位置和结束位置之后一个位置的迭代器。这些方法可以应用于数组以及标准模板库(STL)中的容器,如向量(`std::vector`)。 对于数组而言,可以直接调用全局命名空间下的`begin()`和`end()`来获得相应的迭代器[^1]: ```cpp #include <iostream> int main() { int ia[5] = { 1, 2, 3, 4, 5 }; // 利用beginend函数遍历并修改元素值 for(auto p = begin(ia); p != end(ia); ++p){ *p *= 2; } // 输出修改后的数组内容 for(const auto& elem : ia){ std::cout << elem << " "; } return 0; } ``` 当涉及到STL容器时,则可以通过成员形式访问这两个函数,也可以通过非成员的形式(即全局版本)。两者效果相同,在大多数情况下推荐使用成员形式以提高可读性[^2]: ```cpp #include <iostream> #include <vector> int main(){ std::vector<int> nums = {1, 2, 3, 4, 5}; // 使用成员形式的begin/end遍历容器 for(auto iter = nums.begin(); iter != nums.end(); ++iter){ (*iter)++; } // 或者使用非成员形式 /* for(auto pos = std::begin(nums); pos != std::end(nums); ++pos){ (*pos)++; } */ // 打印更新后的数值 for(const auto& num : nums){ std::cout << num << " "; } return 0; } ``` 值得注意的是,`end()`返回的是指向最后一个实际存储的数据项后面的地址;因此尝试解引用此指针会导致未定义行为。所以在循环条件判断里应该只用来做边界比较而不应直接对其进行操作[^3].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值