C++ C++;vector仅保存最后一个push_back值

C++ C++;vector仅保存最后一个push_back值,c++,memory-management,vector,push-back,C++,Memory Management,Vector,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]

我是一个新手,我有一个困扰我很多的问题。请帮帮我

我试图将字符数组值保存在向量中。向量的大小与我推回的数字相同。但是,向量中的所有值都是我向后推的最后一个值

代码如下:

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";

    }
为什么呢?有什么不对劲吗

  • 我邀请你到我家来,给你我的地址,你匆匆地把地址写在纸上
  • 你过来看看我的房子有绿色的墙
  • 第二天,你将地址复制到手机的通讯录中,以便妥善保管
  • 几个月后,我把墙壁重新刷成蓝色
  • 几年后,你想再来,从你手机的通讯录上取下我的地址,出现在我的门口
  • 你对我的墙现在是蓝色表示惊讶吗?当你第一次写下我的地址时,他们不是!他们现在怎么会这样?把我的地址复制到你的手机里是如何神奇地改变我墙壁的颜色的
  • 没有

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

    向量
    qField
    反复包含同一指针(
    seed
    )的副本。因此,是的,当然,当您取消引用每个副本时,结果将是相同的!即使您同时修改了指针指向的对象

    复制指针不会神奇地复制它指向的对象,然后将指针的值更新为现在指向指针对象的新副本

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

    您希望存储
    std::string
    s。

    std::vector<std::string> qField;
    
    std::向量qField;
    
    尝试将种子包装在std::字符串中。只需更改几行代码:

    #include<string>
    
    vector<std::string> qField;
    ...
    ...
    qField.push_back(std::string(seed));
    
    #包括
    向量场;
    ...
    ...
    qField.push_back(std::string(seed));
    
    种子
    是一个不断修改的
    字符*
    。所有向量元素都指向同一内存。您添加
    seed
    但打印
    qField[i]
    ,因此您的测试输出证明不了多少。@BenjaminBannier:它证明
    qField
    的每个元素的指针对象都有一个相等的值,从之前的输出来看,这显然不是您的意图。@LightnessRacesinOrbit,嗯,是的。哈,我真的坐在这里等着有人说\o/=)嗯,如果你有蓝色的墙可以帮助别人学习指针,那么我认为这可能是值得的@所有服务的一部分!先生,您需要一块饼干。非常感谢。这解释得很清楚。知道了!!非常感谢你。这一次,结果与预期一样正确。:)
    #include<string>
    
    vector<std::string> qField;
    ...
    ...
    qField.push_back(std::string(seed));