2014-12-06 84 views
1

我想分配一個數組的值到一個向量。它似乎對一個矢量工作正常,但是當我做了一秒鐘,我回來了垃圾值。我認爲這個數字,我知道這是正確的,但它沒有正確分配。我不明白,因爲它對第一個向量工作正常。向量push_back的垃圾值

int sorted[] = {0,1,2,3,4,5,6,7,8,9,10}; 

// make two smaller arrays, do this untill they are a base case size; 
void split(int *dataIN, int dataSize){ 
    // new data will be broken up into two vectors with each half of the 
    // original array. These will be size firstHalfSize and secondHalfSize.  
    int firstHalfSize; 
    int secondHalfSize;  
    vector<int> firstHalf; 
    vector<int> secondHalf;  
    // test to see if array in is odd or even 
    bool isOdd; 
    if (dataSize%2 == 1){ 
     isOdd = true; 
    }else if (dataSize%2 == 0){ 
     isOdd = false; 
    } 
    // determine length of new vectors 
    // second half is firstHalf + 1 if odd.  
    firstHalfSize = dataSize/2; 
    if (isOdd){ 
     secondHalfSize = firstHalfSize + 1; 
    }else if (!isOdd){ 
     secondHalfSize = firstHalfSize; 
    }   
    // assign first half of dataIn[] to firstHalf vector  
    cout << "firs: " << firstHalfSize << endl; 
    for (int i = 0; i < firstHalfSize; i++){ 
     cout << "a: " << dataIN[i] << endl;// make sure i have the right number 
     firstHalf.push_back(dataIN[i]);// assign  
     cout << "v: " << firstHalf[i] << endl;// make sure assigned correctly 
    } 
    // do the same for second half 
    cout << "second: " << secondHalfSize << endl; 
    for (int i = firstHalfSize; i < (firstHalfSize+secondHalfSize); i++){ 
     cout << "a: " << dataIN[i] << endl; 
     secondHalf.push_back(dataIN[i]);  
     cout << "v: " << secondHalf[i] << endl; 
    } 

} 


int main(void){ 
    split(sorted, sizeof(sorted)/sizeof(int)); 
    return 0; 
} 

這是我的結果。正如你所看到的,第一個vector push_back很好,數組值(在「a:」之後)也是正確的。

firs: 5 
a: 0 
v: 0 
a: 1 
v: 1 
a: 2 
v: 2 
a: 3 
v: 3 
a: 4 
v: 4 
second: 6 
a: 5 
v: -805306368 
a: 6 
v: 2 
a: 7 
v: -805306368 
a: 8 
v: 0 
a: 9 
v: 0 
a: 10 
v: 0 

回答

4

在第二種情況下,您是從firstHalfSize進行索引。

需要來清點開始從索引0。例如值:

cout << "v: " << secondHalf[i-firstHalfSize] << endl; 
+1

好感謝我遲鈍。 – 1N5818 2014-12-06 07:06:34

2

你迭代firstHalf從0到firstHalfSize與可變i,所以i將是firstHalf的範圍內,當使用operator[] - 在第二個向量的情況下,i並不意味着同樣的事情。

0

填充的vector正在工作。只是你的調試輸出不正確。當從secondHalf輸出值時,您需要使用來自0的索引,而不是來自firstHalfSize的索引。

如果您利用帶有一對迭代器的std::vectorrange constructor,則可以更簡單地編寫代碼。數組指針可以被視爲迭代器:

void print(const std::vector<int>& data){ 
    for(int value : data) 
    std::cout << value << " "; 
    std::cout << "\n"; 
} 

void split(int *dataIN, int dataSize){ 
    auto firstHalfSize = (dataSize + 1)/2; 
    std::vector<int> firstHalf(dataIN, dataIN + firstHalfSize); 
    std::vector<int> secondHalf(dataIN + firstHalfSize, dataIN + dataSize); 

    std::cout << "firstHalf: "; 
    print(firstHalf); 
    std::cout << "seconHalf: ";  
    print(secondHalf); 
} 

Live demo