我的最终目标是使用C ++中的已知向量列表为未初始化的向量赋值。以下是我的尝试。
std::vector<TTableEntry>& t_entry_vector = tTable->getTTableEntries();
上面的方法成功返回值并分配给t_entry_vector。
然后我的下一个未初始化的矢量列表如下。
std::vector<BTableEntry> b_entry_vector;
b_entry_vector.reserve(t_entry_vector.size());
所以现在我需要遍历t_entry_vector
并将值填充到b_entry_vector
。我以下面的方式尝试了它,我需要通过这种for循环来完成它。
int index = 0;
for (vector<TTableEntry>::iterator it = t_entry_vector.begin(); it != t_entry_vector.end(); it++)
{
b_entry_vector.at(index).setA(it->getA());
b_entry_vector.at(index).setB(it->getB());
bTable->addBTableEntry(b_entry_vector.at(index));
index++;
}
但是这次尝试失败并返回运行时错误,在内存位置输出out_of_range。我是C ++和vector类的新手。那么有人能帮我解决这个问题吗?
答案 0 :(得分:0)
正如评论所提到的那样,你得到了例外,因为你b_entry_vector
的大小为零。
因此,如果您想继续使用.at()
填充新的向量,您需要做的就是:
// Initialize the new vector with a fixed size and then you can fill it
// as you see fit. You will not see the exception now.
std::vector<BTableEntry> b_entry_vector( t_entry_vector.size() );
另外,你也可以这样做:
// This would just copy the t_entry_vector into b_entry_vector.
std::vector<BTableEntry> b_entry_vector( t_entry_vector );
答案 1 :(得分:-2)
你必须控制矢量的大小。
int index = 0;
for (const auto it: t_entry_vector)
{
if(b_entry_vector.size() < index +1)
continue;
b_entry_vector[index].setA(it->getA());
b_entry_vector[index].setB(it->getB());
bTable->addBTableEntry(b_entry_vector[index]);
index++;
}
OR
for (int index = 0; index < t_entry_vector.size(); index++)
{
if(b_entry_vector.size() < index +1)
continue;
b_entry_vector[index].setA(t_entry_vector[index]->getA());
b_entry_vector[index].setB(t_entry_vector[index]->getB());
bTable->addBTableEntry(b_entry_vector[index]);
}
这样的事情。
另外,如果您有未初始化的b_entry_vector,并且想要将值放入其中,则可以执行以下操作:
for (int index = 0; index < t_entry_vector.size(); index++)
{
BTableEntry newEntry;
newEntry.setA(t_entry_vector[index]->getA());
newEntry.setB(t_entry_vector[index]->getB());
b_entry_vector.push_back(newEntry);
bTable->addBTableEntry(b_entry_vector[index]);
}
你必须明白&#34; b_entry_vector.reserve(t_entry_vector.size())&#34;不会使用值填充向量,而只为它们分配一个位置。 如果您尝试将空选择用作值,则会出现内存访问错误。 并且,如果你已经调整了向量,你应该这样做:
for (int index = 0; index < t_entry_vector.size(); index++)
{
BTableEntry newEntry;
newEntry.setA(t_entry_vector[index]->getA());
newEntry.setB(t_entry_vector[index]->getB());
b_entry_vector[index] = newEntry;
bTable->addBTableEntry(b_entry_vector[index]);
}
但你还是要控制矢量大小,所以,如果没有多少值,请使用push_back。阅读有关向量,这是什么,以及当您使用push_back()函数时向量如何为新值分配内存。