我是新手,我有一个让我烦恼的问题。请帮帮我。
我正在尝试将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
为什么?有什么不对的吗。
答案 0 :(得分:11)
没有。
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