C ++向量只保存最后一个push_back值

时间:2015-05-21 14:34:19

标签: c++ memory-management vector push-back

我是新手,我有一个让我烦恼的问题。请帮帮我。

我正在尝试将char数组值保存在向量中。向量的大小与数字push_back相同。但是,向量中的所有值都是我push_back的最后一个值。

以下是代码:

vector<char*> qField;

int index = 0;

for (int i =1;i <=q_size-seedLength;i++)
{
    index++;
    for (int j=0;j<seedLength-1;j++)
    {
        seed[j] = seed[j+1];
    }
    seed[seedLength-1] = *q_ptr;
    ++q_ptr;                
    seed[seedLength] = '\0';    
    qField.push_back(seed);
    cout << "Insert Seed"<<index<<"\t\t: " <<qField[i]<<"\n";       

} 

/* 
for (int x=0; x<qField.size();x++)
    {
        cout << " Result Query"<<x<<": " << qField[x]<<"\n";
    }

*/  

int x = 0;
for(nuc_vector::iterator iter=qField.begin();iter!=qField.end();++iter)
    {
        cout << x <<"\n";
        x++;
        cout << "Query " << *iter<<"\n";

    }

奇怪的是,值似乎存储在push_back之后的向量中。但是,当我使用另一个循环输出向量qField中的所有值时,所有值都与推回的最后一个值相同。

以下是我的部分结果:

    Insert Seed7313     : 00133310
    Insert Seed7314     : 01333100
    Insert Seed7315     : 13331001
    Insert Seed7316     : 33310013
    Insert Seed7317     : 33100130
    Insert Seed7318     : 31001303
    Insert Seed7319     : 10013033
    0
    Query 10013033
    1
    Query 10013033
    2
    Query 10013033
    3
    Query 10013033
    4
    Query 10013033
    5
    Query 10013033
    6
    Query 10013033

为什么?有什么不对的吗。

2 个答案:

答案 0 :(得分:11)

  1. 我邀请你到我家,给你我的地址,你在纸上记下来。
  2. 你过来看我的房子有绿墙。
  3. 第二天,您将地址复制到手机的地址簿中以便妥善保管。
  4. 几个月后,我把墙壁重新涂成蓝色。
  5. 几年之后,你想再来一次,这样你就可以从手机的地址簿中取出我的地址,然后出现在我家门口。
  6. 你对我的墙现在是蓝色表示惊讶吗?当你第一次写下我的地址时,他们不是!他们现在怎么样?如何将我的地址复制到手机中会神奇地改变我墙壁的颜色?
  7. 没有。

    char*不是字符串,容器或类似的东西。这不是你认为的“价值”。 它是一个指针。 指向指向的对象:在这种情况下,显然是char s的缓冲区。

    您的向量qField一遍又一遍地包含相同指针(seed)的副本。当然,当您取消引用每个副本时,结果将是相同的!即使你在此期间修改了指针指向的东西。

    复制指针不会神奇地复制它指向的东西,然后更新指针的值,现在指向指针的新副本。

    您希望一个对象在语义上包含您尝试存储的数据。你希望它具有价值语义。

    您希望存储std::string

    std::vector<std::string> qField;
    

答案 1 :(得分:1)

尝试将种子包装在std :: string中。只需更改几行代码:

Sub Button22_Click()
If Columns("D:E").Hidden = True Then
Columns("D:E").Hidden = False
Else
Columns("D:E").Hidden = True
End If
End Sub