0

所以我有以下方法:

template <class DT> //needs testing
DT& LinkedSortedArrays<DT>::find (const DT& key)
{
    list<SortedArray<DT>>::iterator it = SAList.begin();
    for( ; it != SAList.end(); ++it){
        try{
            if (it == SAList.begin() && key < (*it)[0]) throw Exception();
            return (*it).find(const_cast<DT&> (key));
        } catch (ArrayException e) {

        }
    }
    throw Exception();
}

我之前已经定义了类ExceptionArrayException. 每次在当前搜索的特定 Array 类中找不到时(*it).find(const_cast<DT&> (key))都会抛出 ArrayException 。是一个。代码编译得很好。但是我还没有在我的程序中尝试过。为什么?我需要有人根据我所做的以下假设来确认或更正我:keySAListSTL List

  1. 每当if (it == SAList.begin() && key < (*it)[0]) throw Exception();抛出异常,就意味着它会抛出for循环之外,甚至是方法之外,对吧?
  2. 我几乎可以肯定最后一行throw Exception();会在方法之外抛出异常。
  3. for循环的排列方式,不会跳过SAList的第一个元素吧?我的意思是,我在整个互联网上都看到了这个特定的代码,它用于迭代列表的所有元素,就好像它是标准的或完美的一样,但是……这让++it我的大脑有些扭曲。帮助?
  4. 我收到一个错误can't convert const int to int&(因为find()in(*it).find(const_cast<DT&> (key))不是属于的LinkedSortedArrays那个,而是另一个需要 DT& 变量并且LinkedSortedArrays'sfind()具有 const DT& 类型的参数的错误),我发现一个可能的解决方案可能是将它写为const_cast<DT&> (key). 我需要对此发表第二意见。

最后,我了解这是否不是一个具体问题,因此我会被否决和/或问题被关闭。我真的不知道还能去哪里问。如果是我在错误的地方问的情况。我很抱歉。

4

1 回答 1

2
  1. 是的,它将向上堆栈,直到找到合适的catch处理程序。如果它没有找到这样的处理程序,程序将终止。

  2. 是的,它会。

  3. 不,它不会,因为end应该将迭代器返回到末尾,而不是最后一个元素。除非该容器的设计也很糟糕,但您必须查阅文档以确定。

  4. 那是一个糟糕的设计,find应该通过const引用来获取它的参数。既然你不能,除非你想冒未定义的行为风险,否则你必须制作一个副本:

    DT nonconstkey = key;
    return it->find(nonconstkey);
    
于 2012-10-23T22:07:05.797 回答