2017-03-28 38 views
-2

我被告知在這裏使用矢量而不是數組爲這個特定的解決方案(My original solution using to dynamically allocate arrays)我的問題是我不真正理解向量,我的書只涵蓋了一小部分。所以,也許我做錯了什麼?我只是試圖學習用矢量解決它的不同方式。所以,當我問是否有可能動態分配一個向量。我的意思是這樣做合法,std::vector<int*> vect= nullptr;,如果不是爲什麼呢?另外,看到一個示例如何使用向量修改我的原始解決方案將非常有幫助。我是一個剛從我的錯誤中學習的初學者。是否可以動態分配一個向量?

#include <iostream> 
#include <vector> 
void sortAscendingOrder(int*, int); 
void LowestTestScore(int*, int); 
void calculatesAverage(int*,int); 
int main() 
{ 
    std::vector<int*> vect= nullptr; 
    int input; 

    std::cout << "Enter the number of testscores you want to enter." <<std::endl; 
    std::cin >> input; 

    vect = new int[input]; 

    for(int count =0; count < input; count++) 
    { 
     std::cout << "Enter the test score" << (count +1) <<":" <<std::endl; 
     std::cin >> vect[count] ; 
     while(vect[count] < 0) 
     { 
      std::cout <<"You enter a negative number. Please enter a postive number." <<std::endl; 
      std::cin >> vect[count]; 
     } 
    } 

    sortAscendingOrder(vect,input); 

    for(int count =0; count < input;count++) 
    { 
     std::cout << "\n" <<vect[count]; 
     std::cout << std::endl; 
    } 
    LowestTestScore(vect,input); 
    calculatesAverage(vect,input); 



    return 0; 
} 
void sortAscendingOrder(int* input,int size) 
{ 
    int startScan,minIndex,minValue; 

    for(startScan =0; startScan < (size-1);startScan++) 
    { 
     minIndex = startScan; 
     minValue = input[startScan]; 
     for(int index = startScan+1;index<size;index++) 
     { 
      if(input[index] < minValue) 
      { 
       minValue = input[index]; 
       minIndex = index; 
      } 
     } 
     input[minIndex]=input[startScan]; 
     input[startScan]=minValue; 
    } 
} 
void LowestTestScore(int* input, int size) 
{ 
    int count =0; 
    int* lowest = nullptr; 
    lowest = input; 
    for(count =1; count <size;count++) 
    { 
     if(input[count] < lowest[0]) 
     { 
      lowest[0] = input[count]; 
     } 
    } 
    std::cout << "Lowest score" << *lowest; 
} 
void calculatesAverage(int* input, int size) 
{ 
    int total = 0; 
    int average =0; 
    for(int count = 0; count < size; count++) 
    { 
     total += input[count]; 

    } 
    average =(total/size-1); 
    std::cout << "Your average is" << average; 
} 
+0

您可能需要解釋一下你的條件多一點。向量使用new分配連續的內存塊。這符合我對動態分配的定義。 –

+2

矢量之美是它爲你做動態分配。更多信息:http://en.cppreference.com/w/cpp/container/vector – user4581301

+0

您的意思是:'auto p_vec = std :: make_unique >();'? – paddy

回答

2

當您希望在運行時增加數組的大小時,需要動態分配數組。就像數組一樣,向量爲它們的元素使用連續的存儲位置。但是,與數組不同的是,它們的大小可以動態變化,而它們的存儲由容器自動處理。

每次將元素添加到容器時,向量不會重新分配。它預先分配一些額外的存儲空間以適應未來的增長。圖書館可以實施不同的增長戰略以平衡內存使用和重新分配,但是無論如何,重新分配只能在對數增長的大小間隔內發生,以便在向量末尾插入單個元素可以提供攤銷後的恆定時間複雜性(見的push_back)

要回答你的問題: 是的,這是可以動態地分配一個載體,沒有,它需要爲std:vector已經這樣做沒有任何額外的努力。因此,動態分配向量是一種多餘的努力。

可以編寫:

#include<vector> 

    typedef std::vector< std::vector<double> >vec_array; 
    vec_array name(size_x, std::vector<double>(size_y)); 

這意味着:一個std::vector<double>size實例,每個包含size_y雙打(初始化爲0.0)。

或者,你可以簡單地使用矢量增加容器的大小(明知自己處理的存儲需求),如:

#include <vector> 

vector<int> vec_array; 
int i; 

for(i=0;i<10;i++) 
    vec_array.push_back(i); 
相關問題