向量 push_back 的垃圾值

Posted

技术标签:

【中文标题】向量 push_back 的垃圾值【英文标题】:garbage values for vector push_back 【发布时间】:2014-12-06 06:56:00 【问题描述】:

我正在尝试将数组的值分配给向量。对于一个向量,它似乎工作正常,但是当我这样做一秒钟时,我得到了垃圾值。我计算出这个数字,我知道它是正确的,但它没有正确分配。我不明白,因为它适用于第一个向量。

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

【问题讨论】:

【参考方案1】:

在第二种情况下,您从 firstHalfSize 开始索引。

您需要从索引 0 开始计算值。例如:

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

【讨论】:

【参考方案2】:

您正在使用变量 i 从 0 迭代 firstHalf 到 firstHalfSize,因此当您使用 operator[] 时,i 将在 firstHalf 的范围内 - 在第二个向量的情况下,i不是同一个意思。

【讨论】:

【参考方案3】:

vector 的填充工作正常。只是您的调试输出不正确。从secondHalf 输出值时,您需要使用从 0 开始的索引,而不是从 firstHalfSize。

如果您利用带有一对迭代器的std::vector range 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

【讨论】:

以上是关于向量 push_back 的垃圾值的主要内容,如果未能解决你的问题,请参考以下文章

程序停止工作并给出垃圾值 C++

垃圾邮件分类

如何通过应用 WEKA 计算垃圾短信的“特征向量”?

朴素贝叶斯应用:垃圾邮件分类

朴素贝叶斯应用:垃圾邮件分类

朴素贝叶斯应用:垃圾邮件分类