cvector存储
1. vector中元素在内存中是连续存储的吗如果是string类型的元素呢
vector中的元素在内存中确实是连续存储的. vector的实现是由一个动态数组构成. 当空间不够的时候, 采用类似于c语言的realloc函数重新分配空间. 正是因为vector中的元素是连续存储的, 所以vector支持常数时间内完成元素的随机访问. vector中的iterator属于Random Access Iterator.
如果vector储存的是string类型. 情况也是一样的. 值得注意的是, string类型并不是简单的char 数组. string中的数组其实也是动态分配的. 为了方便, 你可以这样理解(不完全正确), 当vector中存储string类型时, 其实是数组中存着许多char *类型的指针, 每个指针指向的内容才是string的字符内容. 可以给你一个简单的图示
+----+----+----+----+----+----+
vector | * | * | * | * | | |
+-- |-+--|---- |---- |-------------+
| | | |
v v v v
s1 s2 s3 s4
至于你说的强制类型转换做内存拷贝, 我不太明白你想表达的意思, 所以这点我不知如何说起.
2. C++ 中 vector 如何实现内存分配
<<C++ primer中对顺序容器的内存分配是这样描述的,内容太多,简写一下: 为了支持随机访问,vector中的元素采用顺序存放,即每一个元素紧挨着前一个元素进行存储。那么现在只有可能出现问题了,当内存中没有足够连续的空间去存放新插入来的元素怎么办,C++是这样处理的:重新分配内存空间,将原来旧的元素全部复制到新余扰的存储空间中去,然后再插入新的元素。因此可以看出,如果内存不是特别充足或者内存中没有较大块的空闲空间的,向vector容器中插入元素可能会有相当大的CPU开销。其中最糟糕的情况是每次插入一个元素,程序要将所有的元素复制到一个新的内存块上去,当然对于这种情况c++作了一个折衷的处理:当我们插入元素时,如果老的内存块是连续空闲空间不够,则重新分配一块内存空间,内存空间的大小不是只比旧的内存空间大一个元素的大小,相反而是多分配几个元素空间大小,这样闭毁嫌对于接下来的几个新插入元素做到有空间可以插入,这样之后使得vector的性能得到很大提高,不过这是一个折衷的办法。 vector<int vec; for(int i = 0; i < 10; i++) vec.push_back(i); vector<int::iterator it = vec.begin(); for(int i = 0; i < 5; i++)it++;cout<<&(*it)<< <<*it<<endl; it = vec.insert(it , 33); cout<<&(*it)<< <<*it<<endl;++it;cout<<&(*it)<< <<*it<<endl; 行轿手啦,我给出来吧,具体原因可能要你自己去分析了,其实从上面的解释可以看出原因 003BB93C 33 003BB940 5 呵呵,是不是有点像数组的随机插入,要将插入点后的所有数据往后移动。这么说的话,可能没有用链表高效。 不过根据C++ primer作者给出的解释,vector的实际使用效率要比list和deque要高一点。主要还是要看应用场景吧。
3. c语言里可以用vector吗
1、C语言不能用vector,C标准库没提供vector的功能,可以自己写。
2、vector是C++ stl当中的容器。
vector容器类型
vector容器是一个模板类,可以存放任何类型的对象(但必须是同一类对象)。vector对象可以在运行时高效地添加元素,并且vector中元素是连续存储的。
vector的构造
函数原型:
template<typename T>
explicit vector(); // 默认构造函数,vector对象为空
explicit vector(size_type n, const T& v = T()); // 创建有n个元素的vector对象
vector(const vector& x);
vector(const_iterator first, const_iterator last);
4. C++中如何用Vector保存类 ,如何对类中对象进行cin的赋值操作谢谢
#include <iostream>
#include <vector>
using namespace std;
////////////////////日期类
class Date
{
int y,m,d;
public:
Date(){} //无参构造函数
~Date(){} //析构函数
void Input() //日期输入函数
{
cout<<"请输入出生日期的年:";
cin>>y;
cout<<"请输入生日期的月:";
cin>>m;
cout<<"请输入生日期的日:汪搏";
cin>>d;
}
void Print() //日期输出函数
{cout<<y<<"年"<<m<<"月"<<d<<"日"<<endl;}
};
////////////////////学生类
class Student
{
int number;
char name[20];
Date birthday;
public:
Student(){} //无参构造函数
~Student(){} //析构函数
void Input(Date &d) //学生类输入函数
{
cout<<"请输入学号:";
cin>>number;
cout<<"请输入名字帆让:";
cin>>name;
d.Input(); //调用Date类的Input()函数
}
void Print(Date &d)
// 学生类输出函数
{cout<<"学号:"<<number<<" 名字:"<<name<<" 生日:"; d.Print();} //调用Date类的Print()函数
};
////////////////////学生集合类
class Students
{
vector<Student> V; //定义学生类向量!!!!!!!!!!!!!
public:
Students(){} //无参构造函数
~Students(){} //析构函数
void Append(Student &s) //学生集合类的添加函数,即往学生集合类中输入的函数,把学生信息添加到学生集合类中
{V.push_back(s);}
void Print(Students &st,Date &d)
// 学生集合类输出函数态陵局
{
for(int i=0; i<V.size(); i++)
V[i].Print(d);
} //调用Student类的Print()函数
};
void main()
{
Student s1,s2; Date d;
Students st;
s1.Input(d); s1.Print(d); //学生s1信息的输入、输出
st.Append(s1);
//把学生s1的信息添加到学生集合类中
cout<<endl;
s2.Input(d); s2.Print(d); //学生s2信息的输入、输出
st.Append(s2);
//把学生s2的信息添加到学生集合类中
cout<<endl;
st.Print(st,d); // 学生集合类中所有学生信息的输出
}
希望对你有帮助
5. C++里vector怎么存放函数指针
要动态生成mfc菜单,动态绑定响应命令。
首先把菜单关键词和函数指针绑定在map中,
再通过关键词找到函数来执行。
#include"stdafx.h"
#include<vector>
#include<map>氏磨册
#include<string>
usingnamespacestd;
//声明一个函数指针
int(*pFunc)(int);
intfunc1(intnIn){returnnIn+1;}
intfunc2(intnIn){returnnIn+20;}
typedefint(*pInt)(int);//定义别名才能放在vector中
voidmain()
{
pFunc=func1;//把函数名赋给函数指针
intn=pFunc(1);
pFunc=&func2;
n=pFunc(1);
//vector<int(*pFun)(int)>v_pFunc;//不歼宏能这样定义
//
vector<pInt>v_pInt;
v_pInt.push_back(func1);
v_pInt.push_back(func2);
inti=v_pInt[0](2);
i=v_pInt[1](2);
//
游激map<string,pInt>map_pInt;
map_pInt.insert(pair<string,pInt>("key1",func1));
map_pInt.insert(pair<string,pInt>("key2",func2));
intj=map_pInt["key1"](3);
j=map_pInt["key2"](3);
}20121028更正vector可以直接放函数指针类型,没理解到位。
//vector只能放类型,不能放函数指针变量名
vector<int(*)(int)>v_pFunc;
v_pFunc.push_back(func1);
v_pFunc.push_back(func2);
intk=v_pFunc[0](5);
k=v_pFunc[1](5);