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);