C++ vector 只保存最后的 push_back 值
C++ vector only save the last push_back value
我是新手,有个问题很困扰我。请帮帮我。
我正在尝试将 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] = '[=11=]';
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
这是为什么?有什么问题吗。
- 我邀请你到我家来,给你我的地址,你匆忙记在纸上。
- 你过来看看我家有绿墙
- 第二天,您将地址复制到 phone 的通讯录中以妥善保管。
- 几个月后,我将墙壁重新粉刷成蓝色。
- 几年后,你想再来,就从你phone的通讯录里拿了我的地址,出现在我家门口。
- 你对我的墙现在是蓝色的感到惊讶吗?当你第一次写下我的地址时他们不是!他们现在怎么会这样?将我的地址复制到您的 phone 是如何神奇地改变我墙壁的颜色的?
没有。
A char*
不是字符串、容器或类似的东西。这不是您认为的 "value"。 它是一个指针。它是一个 指向 其他东西的对象:在这种情况下,显然是 char
的缓冲区.
您的向量 qField
包含同一指针 (seed
) 的副本,一遍又一遍。所以是的,当您取消引用每个副本时,结果当然是一样的!即使你同时修改了指针指向的东西。
复制指针并不会神奇地复制它指向的对象然后更新指针的值以指向指针对象的新副本。
您需要一个在语义上包含您要存储的数据的对象。您希望它具有值语义。
您想改为存储 std::string
。
std::vector<std::string> qField;
尝试将种子包裹在 std::string 中。只需更改几行代码:
#include<string>
vector<std::string> qField;
...
...
qField.push_back(std::string(seed));
我是新手,有个问题很困扰我。请帮帮我。
我正在尝试将 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] = '[=11=]';
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
这是为什么?有什么问题吗。
- 我邀请你到我家来,给你我的地址,你匆忙记在纸上。
- 你过来看看我家有绿墙
- 第二天,您将地址复制到 phone 的通讯录中以妥善保管。
- 几个月后,我将墙壁重新粉刷成蓝色。
- 几年后,你想再来,就从你phone的通讯录里拿了我的地址,出现在我家门口。
- 你对我的墙现在是蓝色的感到惊讶吗?当你第一次写下我的地址时他们不是!他们现在怎么会这样?将我的地址复制到您的 phone 是如何神奇地改变我墙壁的颜色的?
没有。
A char*
不是字符串、容器或类似的东西。这不是您认为的 "value"。 它是一个指针。它是一个 指向 其他东西的对象:在这种情况下,显然是 char
的缓冲区.
您的向量 qField
包含同一指针 (seed
) 的副本,一遍又一遍。所以是的,当您取消引用每个副本时,结果当然是一样的!即使你同时修改了指针指向的东西。
复制指针并不会神奇地复制它指向的对象然后更新指针的值以指向指针对象的新副本。
您需要一个在语义上包含您要存储的数据的对象。您希望它具有值语义。
您想改为存储 std::string
。
std::vector<std::string> qField;
尝试将种子包裹在 std::string 中。只需更改几行代码:
#include<string>
vector<std::string> qField;
...
...
qField.push_back(std::string(seed));