2014-12-06 98 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