C++中vector和string类是怎么实现输入的?
2个回答
展开全部
其实是用new运算符,new运算符用于分配堆空间。new的基本语法是"new 类型名";和"new 类型名[]"。前者分配单个对象,后者是比较数组的。还有其他的语法,我这里只说三种。第二种是带赋值的语法:"new 类型名(该类型的一个对象),用于赋值给分配到的空间;和"new 类型名[] { 该类型的对象的列序 };,用于分别赋值给分配到的数组空间。还有一种语法就是“new(指针) 类型名(赋值对象),同上,有对数组的语法,它们是把空间分配到此指针所指的空间上,赋值对象可有可无。
标准库里有一个std::allocator模板,在<memory>里定义,下面是一些源码:
namespace std {
template<class 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); } //分配赋值。
// ...
};
template<class Char_type> char_traits { }; // 为空,一切的类型都是通过对这个类型的专门化来做的,而char_traits<char>和char_traits<wchar_t>是做了专门化,里面有一些char_type的比较函数,比整数到字符类型的转化等。
// 这样,string和vector的实现就好像这样:
template<class Char_type, class Traits=char_traits<Char_type>,class Alloc = allocator<Char_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);
};
}
标准库里有一个std::allocator模板,在<memory>里定义,下面是一些源码:
namespace std {
template<class 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); } //分配赋值。
// ...
};
template<class Char_type> char_traits { }; // 为空,一切的类型都是通过对这个类型的专门化来做的,而char_traits<char>和char_traits<wchar_t>是做了专门化,里面有一些char_type的比较函数,比整数到字符类型的转化等。
// 这样,string和vector的实现就好像这样:
template<class Char_type, class Traits=char_traits<Char_type>,class Alloc = allocator<Char_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);
};
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询