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

0 c++ memory-management vector push-back

我是新手,我有一个问题让我很烦恼.请帮帮我.

我试图将char数组值保存在向量中.向量的大小与数字push_back相同.但是,向量中的所有值都是I 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";

    }
Run Code Online (Sandbox Code Playgroud)

奇怪的是,值似乎存储在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
Run Code Online (Sandbox Code Playgroud)

这是为什么 ?有什么不对的吗.

Lig*_*ica 11

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

它没有.

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

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

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

您需要一个语义上包含您尝试存储的数据的对象.您希望它具有值语义.

你想要存储std::strings.

std::vector<std::string> qField;
Run Code Online (Sandbox Code Playgroud)