簡體   English   中英

向量push_back的垃圾值

[英]garbage values for vector 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;
}

這是我的結果。 如您所見,第一個向量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

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

您需要找出從索引0開始的值。例如:

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

您正在使用變量ifirstHalf從0迭代到firstHalfSize,所以當您使用operator[]時, i將處於firstHalf的范圍內-在第二向量的情況下, i並不意味着同一件事。

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

如果您利用帶有一對迭代器的std::vector 范圍構造函數 ,則可以更簡單地編寫代碼。 數組指針可以視為迭代器:

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

現場演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM