最近學習——關於vector

 

一:
Python中沒有類似c++中的Vector向量;

用List實現:

dict或tuple的list

movies = [{'id':1, 'name':'a'},{'id':2, 'name':'b'}]
movies[0]['name']
 

 

 

二:

關於Vector

向量(Vectors

  1.基本操作
 vector是向量類型,她是一種對象實體,具有值,所以可以看作是變量。她可以容納許多其他類型的相同實體,
如若干個整數,所以稱其爲容器。Vector是C++STL(標準模板類庫)的重要一員,使用她時,只要包括頭文件#include<vector>即可。
 vector可以有四種定義方式: 
vector<int>是模板形式,尖括號中爲元素類型名,她可以是任何合法的數據類型。 
  (1)vector<int> a(10);
//定義了10個整數元素的向量,但並沒有給出初值,因此其值是不確定的。
     
  (2)vector<int> b(10,1);
//定義了10個整數元素的向量,且給出每個元素的初值爲1。這種形式是數組望塵莫及的,
//數組只能通過循環來成批的賦給相同初值。
   
  (3)vector<int> c(b);
//用另一個現成的向量來創建一個向量。
   
  (4)vector<int>d(b.begin(),b.begin()+3);
//定義了其值依次爲b向量中第0到第2個(共3個)元素的向量。
    因此,創建向量時,不但可以整體向量複製性賦值,還可以選擇其他容器的部分元素來定義向量和賦值。
特別的,向量還可以從數組獲得初值。例如:
int a[8]={2007,9,24,2008,10,14,10,5};
vector<int> va(a,a+8);
   上面第(4)種形式的b.begin() 、b.end()是表示向量的起始元素位置和最後一個元素之外的元素位置。
向量元素位置也屬於一種類型,稱爲遍歷器。遍歷器不單表示元素位置,還可以在容器中前後挪動。
每種容器都有對應的遍歷器。向量中的遍歷器類型爲:
vector<int>::iterator
因此要輸入向量中所有元素,可以有兩種循環控制方式:
for(int i=0; i<a.size(); ++i)  //第一種方法
     cout<<a[i]<<" ";
 
for(vector<int>::iterator it=a.begin(); it!=a.end(); ++it)  //第二種方法
    cout<<*it<<" ";
第一種方法是下標方式,a[i]是向量元素操作,這種形式和數組一樣;
第二種方法是遍歷器方式,*it是指針間訪形式,它的意義是it所指向的元素值。
  a.size()是向量中元素的個數,a.begin()表示向量的第一個元素,這種操作方式是一個對象捆綁一個函數調用,
表示對該對象進行某個操作。
   類似這樣的使用方式稱爲調用對象a的成員函數,這在對象化程序設計中很普遍。
向量中的操作都是通過使用成員函數來完成的。它的常用操作有:
a.assign(b.begin(), b.begin()+3);   //b向量的0~2元素構成向量賦給a
a.assign(4,2);                                      //使a向量只含0~3元素,且賦值爲2
int x=a.back();                                   //將a的最後一個向量元素值賦給整數型變量x
a.clear();                                             //a向量中元素清空(不再有元素)
if(a.empty()) cout<<"empty";      //a.empty()經常作爲條件,判斷向量是否爲空
int y=a.front();                                 //將a的第一個向量元素值賦給整型變量y
a.pop_back();                                  //刪除a向量的最後一個元素
a.push_back(5);                             //在a向量最後插入一個元素,其值爲5
a.resize(10);                        //將向量元素個數調至10個。多則刪,少則補,其值隨機
a.resize(10,2);                    //將向量元素個數調至10個。多則刪,少則補,其值爲2
if(a=b) cout<<"epual";    //向量的比較操作還有 !=, <,< =, >,> =
  除此之外,還有元素的插入與刪除、保留元素個數、容量觀察等操作。
  向量是編程中使用頻率最高的數據類型。
這不僅因爲數據的順序排列性在生活中最常見,還因爲向量中有一些插入、刪除、搜索、判空等最簡單的常規操作。
當數據並不複雜時,可以代替其他數據類型而很好的工作。特別是向量可以自動伸展,容量可以自動增大,
這對一些不確定數據量的容器工作帶來了極大的方便。
 
1.向量-->添加元素
//向量-->添加元素
//例:讀入一個文件yuexingtian.txt 的數據到向量中,文件中爲一些整數(不知個數的情況)。
//要判斷向量中的元素有多少個兩兩相等的數對,如下:
//===============yuexingtian-->begin==============================
//向量操作
-->添加元素(例1)
//============================================================
#include<iostream>
#include<fstream>
#include<vector>

using namespace std;
//-------------------------------
int main()
{
  ifstream in("yuexingtian.txt");//yuexingtian.txt文件必須要和此程序放在同一個文件夾下
 
vector<int> s;
 for(int a; in>>a;)//將yuexingtian.txt的數據全都讀入a中
   
s.push_back(a);//在s向量最後插入元素a的值
 
int pair=0;
 for(int i=0;i<s.size()-1;++i)//比較是否有相等的數的for循環
 
for(int j=i+1;j<s.size();++j)
   if(s[i]==s[j]) pair++;
  cout<<pair<<endl;
}
//========================end============thanks=================
  因爲不知道文件中的元素個數,所以無法用數組來處理,也無法向向量定義中確定元素個數,但可以先創建一個空向量,
然後用添加操作不斷往向量中添加元素。
  如果頻繁擴充容量,就要顯著增加向量操作的負擔,因爲擴充意味着分配更大空間,複製原空間到現空間,刪除原空間。
向量並不是每次擴展都要擴容,向量中預留了一部分未用的元素供擴展之用。
  一開始若創建一個空向量,則向量中已經含有一些未用的元素,可以用capacity()查看。
如果上述程序面臨着大量數據,比如10萬個整數,這時候,爲了保持向量的性能,應該在一開始就規定保留未用元素的數量。
yuexingtian.txt文件內容:
 
運行結果:
 
 
//===============yuexingtian-->begin==============================
//向量操作
-->添加元素(例2)
//============================================================
#include< iostream>
#include <vector>
#include< string>

using namespace std;
int main()
{
vector<string> sval;//定義一個向量
string str1("yue");
string str2("xing");
sval.push_back(str1);//在sval向量最後插入一個值,值爲"yue"
sval.push_back(str2);//在sval向量最後插入一個值,值爲"xing"
  
for(vector<string>::iterator iter=sval.begin();iter!=sval.end();++iter)
    //vector<string>::iterator爲遍歷器;可查看:《C++數據類型——向量(1)》
     cout<<*iter<<" ";
     cout<<endl;
    return 0;
}
//========================end============thanks=================

//=================http://yuexingtian.cublog.cn=======================
運行結果:
 
DE>//二維向量(2-D Vectors)
//在二維向量中,可以使用vector中的swap操作來交換兩個向量。swap操作是專門爲提高
//兩向量直接互相交換的性能兒設計的。如果用一般的的swap:
//eg:void sawp(vector<int>&a,vector<int>&b)
//   {vector<int> temp=a;a=b;b=temp;}
//它涉及向量的創建、賦值、在賦值,最後還要銷燬臨時向量。但若用vector的swap操作,
//這些工作都可以省掉。只要做微不足道的地址交換工作,豈不美哉?!
//eg:文件yuexingtian.txt中含有一些行,每行中有一些整數,可以構成一個向量。
//整個文件可以看成是一組向量,其中每個元素又都是向量,只不過元素的向量其長度
//參差不齊。設計一個程序,使得按從短到長的順序輸出每個向量:
//=============yuexingtian-->begin==================
//如干個向量按長短排序
//================================================== 
#include<iostream>
#include<fstream>
#include<sstream>
#include<vector>
using namespace std;
//----------------------------
typedef vector<vector<int> > Mat;DE>
DE>DE>
DE>
Mat input();
void mySort(Mat &a);
void print(const Mat &a);
//----------------------------
int main()
{
  Mat a=input();
  mySort(a);
  print(a);
  return 0;
}
//----------------------------
Mat input()//輸入 
{
 ifstream in ("yuexingtian.txt");
 Mat a;
 for (string s;getline(in,s);)
 {
   vector<int> b;
   istringstream sin(s);
   for(int ia; sin>>ia; )
     b.push_back(ia);
   a.push_back(b);
 }
 return a;
}
//----------------------------------
void mySort(Mat &a)//排序 
{
 for(int pass=1;pass<a.size();++pass)
 for(int i=0;i<a.size()-pass;++i)
   if(a[i+1].size()<a[i].size())
     a[i].swap(a[i+1]);
}
//-----------------------------------
void print(const Mat &a)//輸出 
{
 for(int i=0;i<a.size();++i)
 {
   for(int j=0;j<a[i].size();++j)
     cout<<a[i][j]<<" ";
     cout<<endl;
 }
}
//=========================end========================


DE>
運行結果:

 

yuexingtian.txt文件:

 

     程序分析:輸出print()函數是一個雙重循環,它按序將二維向量中的每一個元素(向量)打印出來。且每打印一個向量,就換行。
mySort是排序函數,他按向量元素個的多少進行排序,使用的是“冒泡法“。
   排序中所使用的swap就是兩個向量相互交換的操作,它在vector中定義。
用typedef來定義Mat這個二維向量的名字,以使程序中是名稱易記易用。
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章