vector

原网址: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头文件!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
05-29
在 C++ 中,vector 是一个动态数组容器,可以存储任意类型的数据。使用 vector 可以方便地进行动态内存分配和管理,而不需要手动进行内存分配和释放。 vector 提供了一系列的成员函数,可以方便地进行元素的插入、删除、查找和访问等操作。以下是一些常用的操作: 1. 创建 vector 对象: ```c++ #include <vector> std::vector<int> vec; // 创建一个空的 vector std::vector<int> vec1(10); // 创建一个包含 10 个默认值的 vector std::vector<int> vec2(10, 0); // 创建一个包含 10 个值为 0 的 vector std::vector<int> vec3 = {1, 2, 3, 4}; // 创建一个包含 4 个元素的 vector,初始值为 1, 2, 3, 4 std::vector<int> vec4(vec3); // 创建一个与 vec3 完全相同的新 vector ``` 2. 访问 vector 中的元素: ```c++ std::vector<int> vec = {1, 2, 3, 4}; std::cout << vec[0] << std::endl; // 访问第一个元素,输出 1 std::cout << vec.at(2) << std::endl; // 访问第三个元素,输出 3 std::cout << vec.front() << std::endl; // 访问第一个元素,输出 1 std::cout << vec.back() << std::endl; // 访问最后一个元素,输出 4 ``` 3. 插入和删除元素: ```c++ std::vector<int> vec = {1, 2, 3, 4}; vec.push_back(5); // 在末尾插入元素 5 vec.insert(vec.begin() + 2, 10); // 在第三个位置插入元素 10 vec.erase(vec.begin() + 1); // 删除第二个元素 ``` 4. 获取 vector 中的信息: ```c++ std::vector<int> vec = {1, 2, 3, 4}; std::cout << vec.size() << std::endl; // 输出 vector 的大小,即元素个数,输出 4 std::cout << vec.empty() << std::endl; // 判断 vector 是否为空,输出 0(因为不为空) ``` vector 还提供了一些其他的函数,如排序、反转、查找等,具体可以参考 C++ 标准库的文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值