c++中的vector是如何保存string的?

string的长度不确定,占用的空间大小也不确定,STL中的vector是如何保存string的,难道保存的是指针?现在想自己写一个类似vector的类,是不是也要使用保... string的长度不确定,占用的空间大小也不确定,STL中的vector是如何保存string的,难道保存的是指针?
现在想自己写一个类似vector的类,是不是也要使用保存对象指针的方法?
vector也是采用保存指针的方法么? 是不是要重载解引用操作符? 如果不重载解引用操作符,当想通过指针获取值的时候得到的应该是指向目标对象的指针吧?
回 梦想窗外 :我原来就是用模板类实现的,可是存储string类型的时候在运行时出现了错误(存储其他类型的时候都正常,我是使用allocator类分配的内存空间)
展开
 我来答
百度网友2656e7b7a
2009-05-07
知道答主
回答量:13
采纳率:0%
帮助的人:0
展开全部
看了那么多人的回答,回答的却都是保存指针的说法,其实这是错误的,STL中的所有容器提供的都是值语义,也就是说当你把一个string对象放入vector时,vector中保存的是string的一个完整的拷贝,而不是指针。对于这一点在《C++ Standard Library: A Tutorial and Reference》一书中的5.10.2节中有详细的讨论。
q嘿仔
2009-05-02 · TA获得超过2879个赞
知道小有建树答主
回答量:107
采纳率:0%
帮助的人:183万
展开全部
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是一个类(也是类型),如果你用的是模版,你不用管它究竟是什么类型,系统会给你处理的,内置类型,用户自定义类型(包括标准库里边的类)都一样,它是在编译期间才实现代码具体化的。我想你的错误应该处在模版指针的定义上了!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
C_stu
2009-05-08 · TA获得超过456个赞
知道小有建树答主
回答量:694
采纳率:0%
帮助的人:630万
展开全部
vector,deque保存的都是string对象的复制,当其长度要超过当前给他分配的内存容量时,就会复制vector内的所有元素,并转移到一个新的内存空间中(新的内存空间容量根据内存分配策略实现,具体是在原来的容量基础上增加1/2)
当前vector容器的内存容量通过reserve获取,当然亦可通过capacity自行设置其内存容量..
对了,list才是通过链表实现的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
jqk1986
2009-04-26 · TA获得超过285个赞
知道答主
回答量:127
采纳率:0%
帮助的人:0
展开全部
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;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
lsjsoft
2009-04-26 · 超过13用户采纳过TA的回答
知道答主
回答量:55
采纳率:0%
帮助的人:48.7万
展开全部
首先vector不能使用realloc分配内存,应该用标准的new 和 delete
其实,应该使用模板实现。
采用保存指针的方法是C/C++高效的方法
不需要重载解引用操作符
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式