【发布时间】:2014-09-29 10:55:55
【问题描述】:
我对这个练习感到困惑。
练习 9.22:假设 iv 是一个整数向量,下面的程序有什么问题?您将如何纠正这些问题?
vector<int>::iterator iter = iv.begin(),
mid = iv.begin() + iv.size()/2;
while(iter != mid)
if(*iter == some_val)
iv.insert(iter, 2 * some_val)
我要做的第一件事就是去问问这个计划的目的是什么。由于我不确定这本书的这一部分是谁写的,也不想因为一些可能微不足道的事情而打扰作者,所以我开始猜测。
我假设他们想在向量中插入第一个值的双精度值,直到该值位于中间。 (因为他们将 iter 指向开头并且从不通过向量来查找实际值(然后他们再次将其命名为 some_val,查找不在开头的值是一个微不足道的修复,但随后必须验证该值实际上是在容器的前半部分))
所以 a) 向量会像这样增长?
{1,2,3,4,5}
{(2),1,2,3,4,5}
{2,(2),1,2,3,4,5}
{2,2,(2),1,2,3,4,5}
这种情况下的第一个问题是,插入向量很可能会立即使迭代器无效。 我们可以使用一个列表来代替,但是我们不能使用迭代器算术来计算中间值。 像示例中那样只计算一次 mid 是不够的,因为在像 a 这样的列表中。)它会指向 3 并一直指向 3,这只是因为我们调用了迭代器 mid 并用 mid 中的元素初始化了他并不意味着在所有这些插入之后它仍然指向中间。
这就是我所做的:
vector<int>::iterator iter=iv.begin();
while(iter!=iv.begin()+iv.size()/2){ //calculating mid each time
if(*iter==some_val)
iv.insert(iter,2*some_val);
iter=iv.begin(); //revalidate iter
while(*iter!=some_val) //find the original first element
++iter;
}
我看到练习如何迫使您考虑使用哪个顺序容器以及迭代器在不断增长的容器中的行为方式,但是练习的呈现方式仍然让我感到困惑。我是否遗漏了一些明显的观点?
PS:由于整章都在讨论顺序容器,所以我没有关注由 while 循环中的条件引起的问题(就像他们忘记了他们在几章前教过的所有内容)。
【问题讨论】:
-
我认为练习的重点只是迭代器的失效。你可能想看看
std::vector::insert返回什么。 -
我注意到的第一件事是
iv.instert。不过,它可能不是想要的问题。
标签: c++ iterator containers sequential