vector源码讲解_vector教程

hacker|
144

文章目录:

C++中vector和string类是怎么实现输入的?

其实是用new运算符,new运算符用于分配堆空间。new的基本语法是"new 类型名";和"new 类型名[]"。前者分配单个对象,后者是比较数组的。还有其他的语法,我这里只说三种。第二种是带赋值的语法:"new 类型名(该类型的一个对象),用于赋值给分配到的空间;和"new 类型名[] { 该类型的对象的列序 };,用于分别赋值给分配到的数组空间。还有一种语法就是“new(指针) 类型名(赋值对象),同上,有对数组的语法,它们是把空间分配到此指针所指的空间上,赋值对象可有可无。

标准库里有一个std::allocator模板,在memory里定义,下面是一些源码:

namespace std {

templateclass T class allocator {

// ...

typedef size_t size_type;

T* allocate(size_type sz,int =0); // 比较sz个空间

void constuct(T* p, const T value) { new (p) T(value); } //分配赋值。

// ...

};

templateclass Char_type char_traits { }; // 为空,一切的类型都是通过对这个类型的专门化来做的,而char_traitschar和char_traitswchar_t是做了专门化,里面有一些char_type的比较函数,比整数到字符类型的转化等。

// 这样,string和vector的实现就好像这样:

templateclass Char_type, class Traits=char_traitsChar_type,class Alloc = allocatorChar_type class string {

// ...

Alloc alloc;

Char_type* all_ptr;

void push_back(Char_type val); 用alloc.construct即new (pointer) Char_type(val);来实现

string operator+(const char* p);

};

}

c++ stl里的向量vector非常好用,那么它是怎么实现的呢

这个要去翻源码了,STL里的代码说实话,真的看不太懂。

如果不是太纠结于具体细节,可以简单讲讲基本的实现思路,大致如下:

vector从功能上来讲,属于顺序存储容器,所以底层实现一般基于数组。

vector使用模板元编程技术实现,具体一点就是编译器根据使用时指定的实际类型在编译时执行模板特化,编译出对应的代码。也就是说vectorint v1; vectordoublev2;它们各对应一个特化版本的代码。这提高了代码的抽象级别,但是对带来了代码膨胀的问题。

vector的重要特性之一就是实现了数组的动态递增。简单来说就是容器内部记录当前的足最大容量和使用量。当添加元素的时候,如果容器类发现当前的容量已耗尽,容器类会自动地重新分配一个更大容量的数组,把当前的所有元素copy过去,然后释放掉旧的数组,从而实现动态自增,这一切对使用者来说完全透明。

vector提供迭代器来提供统一的遍历访问接口,方便与STL中的其它组件进行交互。

这其中会有很多的细节,比如:

1. 是否允许vector在必要时缩小自身容量?

2. vector容量耗尽后的递增量是多少?

3. 是否应该提供线程安全容器?

有些东西可能真的需要去翻源码去看才能搞明白。或者可以参考侯捷的《STL源码剖析》。其实vector本身的实现并不会太复杂,它的实现思路也很简单,但是设计层面的一些取舍就需要经过仔细考量了。一般来说,STL是一个足够坚实的后盾,我们会频繁地使用它,以构建健壮高效的软件。能够理解STL里的一些设计思想和实现方式,对提高我们的编程思维和编程能力会所帮助。

求c++中vector用法

vector是STL对数组的封装,它支持两种使用方式,数组大小可变。

一种是与C语言中的数组使用方式相同,支持随机访问,数组大小动态变化。也就是使用data[i]的方式,这种方式与C语言中使用相同,但是存在没有边界检查的缺点(微软的编译器中有边界检查,gcc中没有),所有建议使用迭代器的方式iterator进行使用。

另一种是支持队堆栈是操作,也就是使用push_back、push_front等。如果想要详细了解,可以查看源码。

以上全手打,希望采纳。

#include 在C++中代表什么意思啊?vector是类模板名么?然后是这个类模板的内内部内容是什么啊?

包含 vector 头文件的意思,这个头文件当中,描述了一个叫做vector的容器模板。

这个容器包含的内容的类型,要在使用的使用给出,例如

vectorint idlist ;

这就是模板类的实例化。

具体的实现,你可以打开 vector文件,仔细分析源码。

如何查看c++ vector容器源代码

1).#include iostream

#include vectorusing namespace std;int main()

{

int a[7]={1,2,3,4,5,6,7};

vectorint va(a,a+7); for(int i=0;iva.size();i++)

coutva[i]" ";

} 这个是简单的遍历向量,输出向量全部元素。 2).这是简单的从向量 test.txt 文本文件中提取数据到向量 vectorstring va 中,然后在输出。test.txt 的文本内容如下: 运行结果如下://程序代码如下:#include iostream

#include vector

#include fstream

#include stringusing namespace std;int main()

{

vectorstring va;

ifstream in("test.txt");

for(string s;ins;)

va.push_back(s);

for(int i=0;iva.size();i++)

coutva[i]" ";

}

关于c++ vector

你用的是VS2010来测试的,所以输出和你预想的不一样,如果你用的是VC6,输出和你想象的就一样了。

在VC6里面用的vector,iterator的实现很简单,就是个指针:

typedef _Ty _FARQ *pointer;

typedef _A::pointer _Tptr;

typedef _Tptr iterator;

可以看到,iterator它就是个指针,所以,如果在VC6里面测试,输出是对的

而在VS2010里面,iterator就不是个指针了,而是个类:

typedef _Vector_iterator_Mybase iterator;

可以看到,iterator其实是个模板类对象。所以,按照你的输出结果就不对了。

至于你说的第4点,end()返回的迭代器指向的是元素结束的下一个位置,两种写法都对。

附VC6下面的测试截图:

可以看到,输出和你原来的预想是一样的。VS2010里面就不一样了。

关于你补充的:

对于作用于对象上的++操作符,你不能相当然认为就是加在对象本身上,还是得从vector源代码找原因,通过看VS2010 vector的代码发现,++操作符是重载过的,代码如下:

_Myiter operator++()

        {    // preincrement

 #if _ITERATOR_DEBUG_LEVEL == 2

        if (this-_Getcont() == 0

            || this-_Ptr == 0

            || ((_Myvec *)this-_Getcont())-_Mylast = this-_Ptr)

            {    // report error

            _DEBUG_ERROR("vector iterator not incrementable");

            _SCL_SECURE_OUT_OF_RANGE;

            }

 #elif _ITERATOR_DEBUG_LEVEL == 1

        _SCL_SECURE_VALIDATE(this-_Getcont() != 0);

        _SCL_SECURE_VALIDATE_RANGE(

            this-_Ptr != 0

             this-_Ptr ((_Myvec *)this-_Getcont())-_Mylast);

 #endif /* _ITERATOR_DEBUG_LEVEL */

        ++this-_Ptr;

        return (*this);

        }

可以看到,这个++操作符是作用在迭代器内部的一个指针上面的,而不是作用于迭代器本身。

另外,其它的操作符像*(解引用)也是重载过的,所以,你按照自己的想法来输出的时候,可能会比较奇怪,这些你要从源代码来分析。

1条大神的评论

  • avatar
    访客 2022-10-08 下午 01:43:11

    pe的比较函数,比整数到字符类型的转化等。 // 这样,string和vector的实现就好像这样: templateclass Char_type, class Traits=char_traitsChar_type,class Alloc = allocatorChar

发表评论