std :: out_of_range在向量列表中的内存位置

时间:2018-02-08 09:21:54

标签: c++ vector

我的最终目标是使用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类的新手。那么有人能帮我解决这个问题吗?

2 个答案:

答案 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()函数时向量如何为新值分配内存。