c++ stl库中begin()和end()的区别

2024-02-11 03:08
文章标签 c++ 区别 end stl 库中 begin

本文主要是介绍c++ stl库中begin()和end()的区别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

c.begin();           返回指向容器最开始位置数据的指针

c.end();             返回指向容器最后一个数据单元+1的指针

如果我们要输出最后一个元素的值应该是 *(--c.end());

有小伙伴可能不太理解为什么这么定义?这样定义有以下几个好处:

  1. 数组的空间占用等于终点指针减去起点指针;
  2. 数组的终点指针减去起点指针之差,再除以单个元素的长度,等于数组元素的个数;
  3. 判断是否到尾部只要!=end就行了;
  4. 判断空区间很简单begin()==end();

vector源码:

	const_iteratorbegin() const _GLIBCXX_NOEXCEPT{ return const_iterator(this->_M_impl._M_start); }iteratorend() _GLIBCXX_NOEXCEPT{ return iterator(this->_M_impl._M_finish); }boolempty() const _GLIBCXX_NOEXCEPT{ return begin() == end(); }

从STL源码上来看,end()返回的是_M_finish,而_M_finish = _M_start + n(n为元素对象的个数),begin() == end()可以直接判空,而c(c++)语言中,数组都是从下标为0处开始,所以end()返回的自然是最后一个节点的后一个节点。这也是计算机语言的和谐之美。

set:

#include <bits/stdc++.h>
using namespace std;
int main()
{set <int> s;s.insert(5);s.insert(7);s.insert(2);s.insert(1);set<int>::iterator it;for(it = s.begin(); it != s.end(); it++)cout << *it << endl;cout << "容器中第一个元素是:" << *s.begin() << endl;cout << "容器中最后一个元素是:" << *(--s.end()) << endl;
}

vector:

#include <bits/stdc++.h>
using namespace std;
int main()
{vector <int> v;v.push_back(5);v.push_back(7);v.push_back(2);v.push_back(1);vector<int>::iterator it;for(it = v.begin(); it != v.end(); it++)cout << *it << endl;cout << "容器中第一个元素是:" << *v.begin() << endl;cout << "容器中最后一个元素是:" << *(--v.end()) << endl;
}

这篇关于c++ stl库中begin()和end()的区别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/698661

相关文章

利用c++判断水仙花数并输出示例代码

《利用c++判断水仙花数并输出示例代码》水仙花数是指一个三位数,其各位数字的立方和恰好等于该数本身,:本文主要介绍利用c++判断水仙花数并输出的相关资料,文中通过代码介绍的非常详细,需要的朋友可以... 以下是使用C++实现的相同逻辑代码:#include <IOStream>#include <vec

基于C++的UDP网络通信系统设计与实现详解

《基于C++的UDP网络通信系统设计与实现详解》在网络编程领域,UDP作为一种无连接的传输层协议,以其高效、低延迟的特性在实时性要求高的应用场景中占据重要地位,下面我们就来看看如何从零开始构建一个完整... 目录前言一、UDP服务器UdpServer.hpp1.1 基本框架设计1.2 初始化函数Init详解

C++ 右值引用(rvalue references)与移动语义(move semantics)深度解析

《C++右值引用(rvaluereferences)与移动语义(movesemantics)深度解析》文章主要介绍了C++右值引用和移动语义的设计动机、基本概念、实现方式以及在实际编程中的应用,... 目录一、右值引用(rvalue references)与移动语义(move semantics)设计动机1

MySQL 筛选条件放 ON后 vs 放 WHERE 后的区别解析

《MySQL筛选条件放ON后vs放WHERE后的区别解析》文章解释了在MySQL中,将筛选条件放在ON和WHERE中的区别,文章通过几个场景说明了ON和WHERE的区别,并总结了ON用于关... 今天我们来讲讲数据库筛选条件放 ON 后和放 WHERE 后的区别。ON 决定如何 "连接" 表,WHERE

Mybatis的mapper文件中#和$的区别示例解析

《Mybatis的mapper文件中#和$的区别示例解析》MyBatis的mapper文件中,#{}和${}是两种参数占位符,核心差异在于参数解析方式、SQL注入风险、适用场景,以下从底层原理、使用场... 目录MyBATis 中 mapper 文件里 #{} 与 ${} 的核心区别一、核心区别对比表二、底

C++ move 的作用详解及陷阱最佳实践

《C++move的作用详解及陷阱最佳实践》文章详细介绍了C++中的`std::move`函数的作用,包括为什么需要它、它的本质、典型使用场景、以及一些常见陷阱和最佳实践,感兴趣的朋友跟随小编一起看... 目录C++ move 的作用详解一、一句话总结二、为什么需要 move?C++98/03 的痛点⚡C++

Spring Boot Interceptor的原理、配置、顺序控制及与Filter的关键区别对比分析

《SpringBootInterceptor的原理、配置、顺序控制及与Filter的关键区别对比分析》本文主要介绍了SpringBoot中的拦截器(Interceptor)及其与过滤器(Filt... 目录前言一、核心功能二、拦截器的实现2.1 定义自定义拦截器2.2 注册拦截器三、多拦截器的执行顺序四、过

详解C++ 存储二进制数据容器的几种方法

《详解C++存储二进制数据容器的几种方法》本文主要介绍了详解C++存储二进制数据容器,包括std::vector、std::array、std::string、std::bitset和std::ve... 目录1.std::vector<uint8_t>(最常用)特点:适用场景:示例:2.std::arra

C++构造函数中explicit详解

《C++构造函数中explicit详解》explicit关键字用于修饰单参数构造函数或可以看作单参数的构造函数,阻止编译器进行隐式类型转换或拷贝初始化,本文就来介绍explicit的使用,感兴趣的可以... 目录1. 什么是explicit2. 隐式转换的问题3.explicit的使用示例基本用法多参数构造

C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解

《C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解》:本文主要介绍C++,C#,Rust,Go,Java,Python,JavaScript性能对比全面... 目录编程语言性能对比、核心优势与最佳使用场景性能对比表格C++C#RustGoJavapythonjav