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

作者&投稿:夕苇 (若有异议请与网页底部的电邮联系)
c++中vector<string>可以存放什么数据~

利用C++做信号处理方面的仿真,于是就涉及到了大量数据的存储。由于在读取数据的时候,并不知道数据的长度,这时候,vector就很好用了,因为vector容器不用知道数组的长度。
编写程序读入一组string类型的数据,并将它们存储在vector中,接着,把该vector对象复制给一个字符指针数组。为vector中的每个元素创建一个新的字符数组,并把该vector元素的数据复制到相应的字符数组中,最后把指向该数组的指针插入字符指针数组。

扩展资料
vector拷贝使用总结
1、利用拷贝赋值操作符(深复制)
vector array{3,5,2,6,4};
vector outArray;
outArray = array;
2、利用拷贝构造(深复制)
vector array{3,5,2,6,4};
vector outArray(array);
3、利用swap()函数(交换两个vector)
会清空原vector数组
vector array{3,5,2,6,4};
vector outArray;//设为空
outArray.swap(array);//清空array数组

是你代码有问题.
push_back是把传进去的变量加到后面,
但是你输出的是第一开始的变量.
这就是因为你的定义.
为啥你手贱给vector的构造函数传参数?'a'会被变成int型的97.
这就对应着vector的构造函数,
会给Array分配97个元素.
把('a')去了就可以了.
还有,
你这个代码非常不规范,
因为cin输出string的重载操作符在string中定义着,
所以你这代码就编译不过去.

看了那么多人的回答,回答的却都是保存指针的说法,其实这是错误的,STL中的所有容器提供的都是值语义,也就是说当你把一个string对象放入vector时,vector中保存的是string的一个完整的拷贝,而不是指针。对于这一点在《C++ Standard Library: A Tutorial and Reference》一书中的5.10.2节中有详细的讨论。

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是一个类(也是类型),如果你用的是模版,你不用管它究竟是什么类型,系统会给你处理的,内置类型,用户自定义类型(包括标准库里边的类)都一样,它是在编译期间才实现代码具体化的。我想你的错误应该处在模版指针的定义上了!

vector,deque保存的都是string对象的复制,当其长度要超过当前给他分配的内存容量时,就会复制vector内的所有元素,并转移到一个新的内存空间中(新的内存空间容量根据内存分配策略实现,具体是在原来的容量基础上增加1/2)
当前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;
}

首先vector不能使用realloc分配内存,应该用标准的new 和 delete
其实,应该使用模板实现。
采用保存指针的方法是C/C++高效的方法
不需要重载解引用操作符


java语言怎么将vecto中的r数据放到List表中
Vector r=new Vector();List list=new List();Iterator it=r.iterator();while(it.hasNext()){ int m=(int)it.next();list.add(m);}

EXCEL中A列单元格输入数值后B列单元格显示对应数值
1.您使用的这个函数,{"g","y","r"}是有顺序要求的,y和r调换一下位置便可。2.为何不在B列设置:=IF(A1="g",10,IF(A1="y",5,IF(A1="r",0,"")))3.利用=IF()函数,能解决很多问题。参考资料:若还有问题,请把文件发到:abcdef6898@126.com ...

墨子的十大发明与发现
很难确定它的意思,如果“矩”字不错,则墨家是企图“向量力”(vectoforces)的分析,和力的厂“平形四边形”等,是否有反应,当视所思考的结构,是否平衡而定。又说: 上古及中古中国的实用工程中,还有许多机会获得关於合力之经验和知识。实在说来,在欧洲一直到17世纪,才完全明白这些。而中国早期的气体动力学发明的“...

maya中的mel脚本是什么意思?
8.向量操作:unit(格式化)\/unit($vectoer1);mag(长度)\/mag($vectoer1);angle(夹角,弧度制,如果想获得角度将它乘以180\/pi,方向为逆时针)\/angle($vector1l,$vector2);cross(叉积,与两个向量正交,即垂直的第三个向量,其长度为:dot运算)\/cross($vector1l,$vector2);dot(=mag($...

maya中的mel是什么啊?
7.向量运算(Maya中的点都是向量存储,因此要定位的话向量比较重要):向量相减:代表向量从一个点移到另一个点所需行进的方向和距离,减数指向被减数 8.向量操作:unit(格式化)\/unit($vectoer1);mag(长度)\/mag($vectoer1);angle(夹角,弧度制,如果想获得角度将它乘以180\/pi,方向为逆时针...

关于MAYA,3D软件.
7.向量运算(Maya中的点都是向量存储,因此要定位的话向量比较重要):向量相减:代表向量从一个点移到另一个点所需行进的方向和距离,减数指向被减数 8.向量操作:unit(格式化)\/unit($vectoer1);mag(长度)\/mag($vectoer1);angle(夹角,弧度制,如果想获得角度将它乘以180\/pi,方向为逆时针)\/angle($vector1l,$vec...

博兴县17631597105: c++中的vector是如何保存string的? -
仲孙真多西: 看了那么多人的回答,回答的却都是保存指针的说法,其实这是错误的,STL中的所有容器提供的都是值语义,也就是说当你把一个string对象放入vector时,vector中保存的是string的一个完整的拷贝,而不是指针.对于这一点在《C++ Standard Library: A Tutorial and Reference》一书中的5.10.2节中有详细的讨论.

博兴县17631597105: 怎样把C++中的list或者vector存入文件? -
仲孙真多西: 因为这两个的数据结构都不是数组那样的一坨连续空间啊.vector为例,你直接存文件的话存的是元素个数和存储空间的首地址,根本没存内容,当然首地址存了也没意义.list是链表更不用说了.还是老老实实一个一个存吧.当然普通的vector可以偷懒存长度然后直接取第一个元素地址当数组存.读的时候读长度,初始化vector,还是取第一个元素地址当数组读.

博兴县17631597105: c++类中有vector成员,能否存入文件,并再完全读取出来 如果可以,请写一下diskIn()和diskOut()谢谢 -
仲孙真多西: 能遍历就能保存,用迭代器或者下标;#include#include void fun() { vectors; ofstream os; os.open("data.txt"); for (int i = 0; is.push_back(i); for (vector::iterator it = s.begin(); it != s.end(); it++) osos.close(); } void fun1() { vectors; int a; ifstream os; ...

博兴县17631597105: C++ STL Vector如何存放类的对象? -
仲孙真多西: #include<vector>和#include <string>记得加上 A(int aa,int bb,string cc):a(aa),b(bb),str(cc){} //c改成strvector<A*> vec; //这存的是类对象指针vector<A> vec; //这才是存类对象vec.push_back(A(123,111,"abcd")); //添加对象满意请采纳!

博兴县17631597105: c++中vector的存储问题 -
仲孙真多西: c++中的stl除了平常使用的vector、map之类的还有一个组件叫Allocator.其实是stl各类数据结构中统一的负责内存分配的组件.Allocator很少被显示的调用,但其实各类stl数据结构在初始化的时候都支持显示的指定Allocator组件.各类结构中的...

博兴县17631597105: c++编程问题,一个vector中元素都是类,如何将这个vector存入文件,如何取出? -
仲孙真多西: 建议使用序列化库或序列化工具,如cereal.可以先在网上学习一下cereal的使用.

博兴县17631597105: C++vector的存储方式,是把数据赋值到堆中吗 -
仲孙真多西: 放在栈里面的nInt.push_back(tmp);实际上放的是tmp的拷贝.你要是没有写拷贝构造函数默认的按位拷贝,这样不安全,你要是写了拷贝构造函数就按按照你的方法在复制.

博兴县17631597105: 我用c++的vector保存一个我自己定义的类,vector<student>stu,然后怎么才能 -
仲孙真多西: 使用fstream读写文件.vector<student>::iterator p; ofstream out; out.open("1.txt"); for(p=a.begin();p!=a.end();++p) out<<*p<<" "; //此处可以用运算符重载实现student整体写入,也可以分别写入student类的成员

博兴县17631597105: C++ vector用法的详解,谢谢! -
仲孙真多西: vector容器类型vector容器是一个模板类,可以存放任何类型的对象(但必须是同一类对象).vector对象可以在运行时高效地添加元素,并且vector中元素是连续存储的. vector的构造函数原型: template<typename T>explicit vector(); ...

博兴县17631597105: C++ STL中的vector怎么使用
仲孙真多西: 用string吧 #include <string> #include <vector> ... vector<string> FileList; // 保存文件路径 // FileList.size() 是目前数组的元素个数 // FileList[n] 是访问第n个元素(注意数组界限) // FileList.push_back("123") 向数组的末尾添加一个元素 // FileList[n].c_str()返回第n个string的c风格字符串

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网