c++中的vector是如何保存string的?
string的长度不确定,占用的空间大小也不确定,STL中的vector是如何保存string的,难道保存的是指针?现在想自己写一个类似vector的类,是不是也要使用保...
string的长度不确定,占用的空间大小也不确定,STL中的vector是如何保存string的,难道保存的是指针?
现在想自己写一个类似vector的类,是不是也要使用保存对象指针的方法?
vector也是采用保存指针的方法么? 是不是要重载解引用操作符? 如果不重载解引用操作符,当想通过指针获取值的时候得到的应该是指向目标对象的指针吧?
回 梦想窗外 :我原来就是用模板类实现的,可是存储string类型的时候在运行时出现了错误(存储其他类型的时候都正常,我是使用allocator类分配的内存空间) 展开
现在想自己写一个类似vector的类,是不是也要使用保存对象指针的方法?
vector也是采用保存指针的方法么? 是不是要重载解引用操作符? 如果不重载解引用操作符,当想通过指针获取值的时候得到的应该是指向目标对象的指针吧?
回 梦想窗外 :我原来就是用模板类实现的,可是存储string类型的时候在运行时出现了错误(存储其他类型的时候都正常,我是使用allocator类分配的内存空间) 展开
展开全部
template<class _Ty,class _Ax =allocator<_Ty> >
class vector
{
public:
typedef typename _Alloc::pointer pointer;
private:
pointer _Myfirst;
pointer _Mylast;
pointer _Myend;
}
这些基本上是我从<vector>中找出来的。而其你正是用allocator来分配内存的,写不管_Alloc::pointer 是从哪里继承来的,但是它肯定是个指针,所以,以用模板加上指针一定能够实现向量,用allocator来分配内存当然最好!说实话,真的要做一个vector类非常难,也非常烦,且不说函数多(这都好说),关键是与迭代器的衔接问题。还有事一定要全,不然没有意义!
string是一个类(也是类型),如果你用的是模版,你不用管它究竟是什么类型,系统会给你处理的,内置类型,用户自定义类型(包括标准库里边的类)都一样,它是在编译期间才实现代码具体化的。我想你的错误应该处在模版指针的定义上了!
class vector
{
public:
typedef typename _Alloc::pointer pointer;
private:
pointer _Myfirst;
pointer _Mylast;
pointer _Myend;
}
这些基本上是我从<vector>中找出来的。而其你正是用allocator来分配内存的,写不管_Alloc::pointer 是从哪里继承来的,但是它肯定是个指针,所以,以用模板加上指针一定能够实现向量,用allocator来分配内存当然最好!说实话,真的要做一个vector类非常难,也非常烦,且不说函数多(这都好说),关键是与迭代器的衔接问题。还有事一定要全,不然没有意义!
string是一个类(也是类型),如果你用的是模版,你不用管它究竟是什么类型,系统会给你处理的,内置类型,用户自定义类型(包括标准库里边的类)都一样,它是在编译期间才实现代码具体化的。我想你的错误应该处在模版指针的定义上了!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
vector,deque保存的都是string对象的复制,当其长度要超过当前给他分配的内存容量时,就会复制vector内的所有元素,并转移到一个新的内存空间中(新的内存空间容量根据内存分配策略实现,具体是在原来的容量基础上增加1/2)
当前vector容器的内存容量通过reserve获取,当然亦可通过capacity自行设置其内存容量..
对了,list才是通过链表实现的
当前vector容器的内存容量通过reserve获取,当然亦可通过capacity自行设置其内存容量..
对了,list才是通过链表实现的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
STL中涉及到动态的东西全是指针,你想啊程序里数据保存的地方无非3个地方,全局区,栈和堆,再以比较就只有堆上了,STL内部使用allocator分配和管理内存的。
2、那肯定是你得设计有问题,给你写个例子:
#include <iostream>
#include <string>
#include <memory>
using namespace std;
template <class T, class Alloc = allocator<T> >
class Vector
{
public:
typedef unsigned int size_type;
typedef T* pointer_type;
typedef const T* const_pointer_type;
typedef T& refrence_type;
public:
Vector() {}
Vector(const Vector<T>& v)
: numElems(v.numElems) {
p = a.allocate(numElems);
a.construct(p, v.p);
}
Vector(const T* begin, const T* end)
: numElems(end - begin) {
p = a.allocate(numElems);
uninitialized_copy(begin, end, p);
}
Vector(size_type n, const T& val = T(), const Alloc& _a = Alloc())
: numElems(n), a(_a) {
p = a.allocate(n);
uninitialized_fill_n(p, n, val);
}
refrence_type
operator [] (size_type i) {
return p[i];
}
const_pointer_type
begin() const {
return p;
}
const_pointer_type
end() const {
return p + numElems;
}
~Vector() {
a.destroy(p);
a.deallocate(p, numElems);
}
public:
//template <class T> STL 通过指针解引用是利用这个类,重载了*和->操作符
//class iteraotor {
//};
private:
T* p;
size_type numElems;
Alloc a;
};
int main()
{
string a[4] = {"你","好", "楼","主"};
Vector<string> v(a, a + 4);
for(Vector<string>::const_pointer_type p = v.begin(); p != v.end(); ++p) // 不设计一个iterator类解引用就是数据对象
cout << *p;
}
2、那肯定是你得设计有问题,给你写个例子:
#include <iostream>
#include <string>
#include <memory>
using namespace std;
template <class T, class Alloc = allocator<T> >
class Vector
{
public:
typedef unsigned int size_type;
typedef T* pointer_type;
typedef const T* const_pointer_type;
typedef T& refrence_type;
public:
Vector() {}
Vector(const Vector<T>& v)
: numElems(v.numElems) {
p = a.allocate(numElems);
a.construct(p, v.p);
}
Vector(const T* begin, const T* end)
: numElems(end - begin) {
p = a.allocate(numElems);
uninitialized_copy(begin, end, p);
}
Vector(size_type n, const T& val = T(), const Alloc& _a = Alloc())
: numElems(n), a(_a) {
p = a.allocate(n);
uninitialized_fill_n(p, n, val);
}
refrence_type
operator [] (size_type i) {
return p[i];
}
const_pointer_type
begin() const {
return p;
}
const_pointer_type
end() const {
return p + numElems;
}
~Vector() {
a.destroy(p);
a.deallocate(p, numElems);
}
public:
//template <class T> STL 通过指针解引用是利用这个类,重载了*和->操作符
//class iteraotor {
//};
private:
T* p;
size_type numElems;
Alloc a;
};
int main()
{
string a[4] = {"你","好", "楼","主"};
Vector<string> v(a, a + 4);
for(Vector<string>::const_pointer_type p = v.begin(); p != v.end(); ++p) // 不设计一个iterator类解引用就是数据对象
cout << *p;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
首先vector不能使用realloc分配内存,应该用标准的new 和 delete
其实,应该使用模板实现。
采用保存指针的方法是C/C++高效的方法
不需要重载解引用操作符
其实,应该使用模板实现。
采用保存指针的方法是C/C++高效的方法
不需要重载解引用操作符
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询