vector

2023-05-16

原网址:http://www.cnblogs.com/zjfdlut/archive/2010/11/13/1876409.html


个人菜鸟,发表下对头文件包含顺序的看法:

首先是常规的包含:

 


   
   
1 #include " a.h " 2 3   int 4 main() 5 { 6 function_a(); 7 }

这是一个在平常不过的包含了,主文件main.cpp包含头文件"a.h",当调用function_a()函数时,由于main.cpp

文件中未包含function_a此函数的声明,那么它会到"a.h"这个文件中去找它的声明。如果在"a.h"这个文件中找不到,

那么它回到"a.h"所包含的头文件中去找,这样一级一级往上找,直到找到或者找不到而报错为止。

 

图中是最为平常的头文件包含。

但是当我在看STL的源代码时却发现了问题,比如stl_vector.h这个文件中的一段代码:

 

代码

    
    
1 template < class _Tp, class _Alloc > 2   void vector < _Tp, _Alloc > ::_M_fill_insert(iterator __position, size_type __n, 3 const _Tp & __x) 4 { 5 if (__n != 0 ) { 6 if (size_type(_M_end_of_storage - _M_finish) >= __n) { 7      ...... 8 fill(__position, __position + __n, __x_copy); 9 } 10 else { 11 ...... 15 fill(__position, __old_finish, __x_copy); 16 } 17 }

代码中有一个fill函数,但是stl_vector.h这个文件中却没有包含这个函数的实现,当我查找其所包含头文件时,却

发现也没有包含这个函数的其它头文件,这时怎么回事呢,当我们想使用该头文件是编译器岂不是回报错?

确实,如果我们直接包含该头文件,编译起将会报fill函数未定义的错误,那么到底是怎么回事呢?

当我们查看vector这个文件时,真相大白:

显然stl_vector.h文件被包含在vector之中,注意在stl_algobase.h文件中包含了fill的实现:

 

stl_algobase.h

    
    
template < class _ForwardIter, class _Tp > void fill(_ForwardIter __first, _ForwardIter __last, const _Tp & __value) { __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator); for ( ; __first != __last; ++ __first) * __first = __value; }

fill这个函数在stl_algobase.h这个文件中。所以当我们在程序中写诸如:

 

 


   
   
#include < vector > int main() {   std::vector<int> vec; }

这种代码时才不会报fill未找到的错误。但如果我们把vector文件中的包含顺寻更改如下:

 

 


   
   
1 #ifndef __SGI_STL_VECTOR 2   #define __SGI_STL_VECTOR 3 ...... 4 #include < stl_vector.h > 5 #include < stl_algobase.h > 6  

时,那就错了,为什么,因为stl_algobase.h文件包含在stl_vector.h之后,fill函数的实现在stl_vector.h

 

文件中将不可见!

结论:

1.头文件的包含必须严格按照顺序,否则结果将难以预料!

2.你不应该直接使用stl_vector.h文件,而应该使用vector头文件!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vector 的相关文章

  • 九补丁与矢量图形

    我正在学习 Android UI 但不清楚为什么人们在可以使用矢量图形的情况下使用九个补丁 因为它们是可扩展的 不会出现任何像素退化 我是 Android 的初学者 所以我希望我在这里不会遗漏任何东西 但似乎构建矢量图形并使用它们会更容易
  • 在 C++ 中检查向量的所有元素是否相等

    如果我有一个值向量并且想要检查它们是否都相同 那么在 C 中有效执行此操作的最佳方法是什么 如果我用其他语言 例如 R 进行编程 我的想法是仅返回容器的唯一元素 然后如果唯一元素的长度大于 1 我知道所有元素不可能相同 在 C 中 可以这样
  • C++ 如何将 char 数组转换为字节向量 (vector)

    我有大量的字符 char myCharArray 0x9B 0x3E 0x34 0x87 0xFD 0x24 0xB4 0x64 0xBA 0x80 0x04 0xFD 0xDF 0x23 0x41 0xEE 0x00 0x00 0x00
  • 在 C++ 中什么时候使用向量,什么时候使用数组?

    我通常不确定什么时候使用其中一种更好 一般来说 它们似乎都做同样的事情 但就其功能而言 向量是否更灵活 什么时候数组比较合适 通常总是更喜欢使用std vector
  • 将函数应用于滚动窗口

    假设我有一个很长的清单A我想要计算的值 例如长度 1000 std100 对 即我想计算std A 1 100 std A 2 101 std A 3 102 std A 901 1000 在 Excel VBA 中 可以通过编写例如以下内
  • 使用shared_ptr的例子?

    你好 我今天问了一个关于如何在同一个向量数组中插入不同类型的对象 https stackoverflow com questions 3475030 different types of objects in the same vector
  • 使用 3 维向量的问题

    如何在 C 中使用 3 维向量 vector
  • 查找向量中最接近的值

    我想要完成的是迭代双精度值向量并返回最接近的可能双精度值的向量位置 我对此有两个问题 当尝试使用以下命令查找向量中最接近的双精度值时lower bound 如果我输入 1 我只会收到非零的值 我不知道如何使用lower bound返回向量位
  • 如何在 C++ 中创建多个向量的组合而无需硬编码循环?

    我有几个数据看起来像这样 Vector1 elements T C A Vector2 elements C G A Vector3 elements C G T up to VectorK elements Note also that
  • 无法在向量向量上使用 emplace_back() 花括号初始化器

    这与我之前提出的有关使用的问题有些相关emplace back在对向量上 将一对插入到 std vector 时 emplace back 与 Push back https stackoverflow com questions 5390
  • gnuplot 动画 2D 矢量场

    我正在尝试使用 gnuplot 制作 2D 矢量动画 我想显示一行 即一次显示一个向量 我的数据结构如下 它们x y u v 2 24448 0 270645 1 00 1 00 3 24448 0 270645 0 500 1 20 我可
  • Numpy 提取网格数据的子集

    在我的应用程序中 我有一个从 meshgrid 命令获得的值矩阵及其坐标 经度 纬度 我想根据经度和纬度限制提取该矩阵的特定子区域 我已经尝试过这个解决方案 但它不起作用 我需要三个矩阵作为输出 一个用于数据 另外两个用于网格 Lons L
  • 是否可以将向量的一部分作为向量发送给函数? [复制]

    这个问题在这里已经有答案了 我想看看是否可以将向量的一部分传递给函数 以便它显示为函数的法线向量 更重要的是 我希望这可以在 O 1 的常数时间内完成 我不想迭代向量来创建一个新向量 事实上 我还希望在下面的示例中将新向量的大小更改为 40
  • 如何在 C++ 中将值从向量转换为映射?

    我想做这样的事情 有没有一个stl算法可以轻松做到这一点 for each auto aValue in aVector aMap aValue 1 如果您有一个对向量 其中对中的第一项将是映射的键 第二项将是与该键关联的值 您可以使用插入
  • rbind 命名向量到不同长度的矩阵

    我正在尝试将命名向量绑定到矩阵上 命名向量的长度与矩阵不同 gt m lt matrix data c 1 2 3 nrow 1 ncol 3 dimnames list c c column 1 column 2 column 3 gt
  • 如何以编程方式移动 OpenLayers Vector?

    API 文档为OpenLayers Feature Vector http dev openlayers org apidocs files OpenLayers Feature Vector js html说 Vector 本身根本没有方
  • c++ - 将“std::vector”的内容保存到文件

    我使用 writeFileBytes 下面的函数来写入a的内容std vector
  • 添加到 std::vector 的中间

    有没有办法将值添加到 a 的中间vector在 C 中 假设我有 vector
  • 在 MATLAB 中用两个值替换向量值

    我必须创建一个以向量作为输入的函数v和三个标量a b and c 该函数替换了的每个元素v等于a有一个二元素数组 b c 例如 给定v 1 2 3 4 and a 2 b 5 c 5 输出将是 out 1 5 5 3 4 我的第一次尝试是尝
  • 尝试将元素推入向量

    在头文件 我没有编写 中 已经定义了一个结构体 如下所示 struct MemoryMessage public boost counted base public FastAlloc explicit MemoryMessage Memo

随机推荐

  • ZYNQ7 DACHE的重要操作

    Flush the SrcBuffer before the DMA transfer in case the Data Cache is enabled Xil DCacheFlushRange u32 TxPacket MAX PKT
  • OV7670摄像采集图像在VGA上显示的分析和实现,精确到每个时钟,每行代码。

    OV7670使用RGB565模式 xff0c 30FPS xff0c 采集分辨率为640X480 xff0c 保存在ZYNQ7芯片7Z020的内部BRAM VGA控制器在读出端读出数据 xff0c 并用12BIT的色彩深度现在VGA接口屏幕
  • Ubuntu 20.04 python2安装pip

    Ubuntu 20已经无法通过apt来安装python2的pip2了 xff0c 只能安装python3的pip 方法 先确保你有python2 暂时还是可以用apt安装python2 sudo apt install python2 下面
  • PetaLinux 2019.1详细安装步骤以及所需要文件

    这里主要根据UG1144文档 xff0c 这两天成功安装使用了PetaLinux的最新版本2019 1 一 xff0c 在虚拟机里安装Ubuntu16 04 1 xff0c 选Ubuntu 操作系统的版本是16 04 我最初尝试过18版本的
  • STC芯片在Keil中的添加与使用

    一 使用官方烧录工具 stc isp v6 88K exe在Keil中添加STC芯片 此烧录工具可在STC官网上下载 二 打开STC ISP软件 xff0c 选择右侧 Keil仿真设置 栏 三 选择 添加型号和头文件到Keil中 添加STC
  • boost 与 C++11 比较

    先不说boost的初始化表是多么怪异的形式了 c 43 43 11用大括号一括起来就OK了 auto 和 boost auto 差别太大了 xff0c 必须得告诉boost auto宏一个类型 xff0c 而非编译器本身的推断 xff0c
  • C++——struct和class的区别

    在C语言中struct是一种数据类型 xff0c 那么就肯定不能定义函数 xff0c 所以在面向c的过程中 xff0c struct不能包含任何函数 否则编译器会报错 而在C 43 43 中 xff0c 其特性也有了新发展 xff0c 就拿
  • roslaunch使用示例

    本文是看了学长ROS 的 roslaunch 中 xml 相关要点 文章之后做了小改动 xff0c 主要是对 roslaunch 文件的简单总结 需要完成的前序工作是已经创建了 catkin 工作空间 xff1b 创建了 catkin 程序
  • 四旋翼的运动原理及几个飞行问题

    四旋翼的运动及原理 飞行的问题 调试 四旋翼飞行器通过调节四个电机转速来改变旋翼转速 xff0c 实现升力的变化 xff0c 从而控制飞行器的姿态和位置 四旋翼飞行器是一种六自由度的垂直升降机 xff0c 但只有四个输入力 xff0c 同时
  • 以太网数据包长度限制

    我们使用以太网进行数据传输 xff08 UDP TCP xff09 xff0c 数据包的大小是有限制的 xff0c 并不是多长都可以 TCP IP协议从下到上包含 xff1a 链路层 IP层 传输层 应用层 链路层 xff1a 链路层的数据
  • 串口接收完整一帧数据包的3种方法

    本文介绍3种使用串口接受一帧完整数据包的方法 xff0c 串口接收数据是字节接收的 xff0c 串口每接收1字节数据 xff0c 产生一个串口中断 xff0c 我们在中断中将接收到的数据存放到buf中进行保存 xff0c 但是数据的发送和接
  • 补码原码转换

    本文主要讲述补码和原码之间的换算 1 原码 转 补码 xff1a 正整数的补码是它本身 xff0c 即 1的原码是0000 0001 xff0c 补码 还是 0000 0001 负整数的补码是符号位不变 xff0c 其余位按位取反 xff0
  • 有符号数与无符号数之间的转换

    本文讲解有符号数和无符号数之间的转换 针对同一数据类型有符号数和无符号数之间的转换 xff0c 例如 int 和 unsigned int 之间和 char 和 unsigned char 之间 这种情况下 xff0c 二者之间的数据类型长
  • Ubuntu由于修改etc/profile文件导致开机无法登陆问题解决办法(仅供参考)

    在安装jdk或者arm linux gcc等开发工具时需要修改profile xff0c 一不小心导致无法正常登录系统 xff0c 这时候可以试试用以下办法解决 xff1a 1 进入ubuntu登录页面 xff0c 按alt 43 ctrl
  • 一文看懂,用示波器查看串口UART的波形,什么是数据位、起始位、奇偶校验位

    先介绍一些概念 起始位 先发出一个逻辑 0 的 信号 xff0c 表示传输数据的开始 校验位 xff1a 数据位加上这一位后 xff0c 使得 1 的位数应为偶数 偶校验 或奇数 奇校验 xff0c 以此来校验数据传送的正确性 就比如传输
  • Could not get lock /var/lib/dpkg/lock 问题解决方法

    今天在ubuntu上安装sqlite 时 xff0c 执行命令sudo apt get y install sqlite3 时 xff0c 系统提示 xff1a Could not get lock var lib dpkg lock op
  • Linux 应用开发之系统调用

    系统调用 xff08 System Call xff09 是操作系统提供给用户程序调用的一组 特殊 函数接口 Linux 系统分为内核空间和用户空间 xff0c 用户空间只能通过系统调用接口与内核空间进行通信 Linux 系统提供了两种方式
  • Linux Qt 开发之多线程

    Qt 应用程序中所有的界面响应事件都在一个主线程中运行 xff0c 当我们去调用QApplication对象的exec 方法时 xff0c Qt就不断去循环查询当前的事件队列中有没有事件发生 xff0c 如果有则转去执行对应的槽函数 xff
  • Linux根文件系统的制作(转载)

    Linux根文件系统的制作 什么是文件系统 计算机的文件系统是一种存储和组织计算机数据的方法 xff0c 它使得对其访问和查找变得容易 xff0c 文件系统使用文件和树形目录的抽象逻辑概念代替了硬盘和光盘等物理设备使用数据块的概念 xff0
  • vector

    原网址 xff1a http www cnblogs com zjfdlut archive 2010 11 13 1876409 html 个人菜鸟 xff0c 发表下对头文件包含顺序的看法 xff1a 首先是常规的包含 xff1a 1