0

我的工作中有重复的代码,我想摆脱它,所以我知道在 C++ 中使用宏不是一个好主意,但我必须使用内联函数,将此函数用作内联是个好主意:

list<Data>::iterator foo(int data){
if(dataExists(data)){
    list<Data>::iterator i;
    for(i = dataClass.begin(); i != dataClass.end(); ++i){
       if(i->getData() == data){
        break;
       }
return i;   //here I have one more problem, what can I return if data doesn't exist?
}

我认为这个功能非常不安全。如何改进我的代码?

4

3 回答 3

8

您在这里所做的事情已经由该std::find()函数完成,因此最好使用它(尽管在练习中尝试自己实现这些东西当然是可以的)。

std::find()还演示了一种指示“未找到”条件的好方法——如果未找到该项目,则它在结束时返回迭代器。这样,调用者可以通过将返回的迭代器与 进行比较来确定是否找到了匹配项Data.end()

于 2010-06-18T09:32:12.547 回答
4

您发布的代码毫无意义。有时您将Data其用作一种类型,而另一种则用作对象。假设它是一个对象,则表明未找到某物的方法是返回一个指向其末尾的迭代器。

return Data.end();

但是您的代码太混乱了,无法在没有重大更改的情况下工作。

您不会通过在 SO 上发布问题来学习 C++ - 它根本无法完成。相反,您需要阅读一本好的 C++ 教科书——我推荐Accelerated C++,它详细介绍了迭代器等内容。如果你继续问这样的问题,你只是在浪费你的时间,更重要的是,浪费我们的时间。

于 2010-06-18T09:40:09.053 回答
1

我真的不知道你在这里问什么,但你的帖子中有几个误解。

第一个内联函数是一种特定的优化,你还不需要关心。先了解正常功能,正确理解。

正如另一个答案已经说过的那样,std::find()做你似乎想做的事情。它不必是列表的成员才能工作,事实上现代 C++ 样式指南通常更喜欢非成员函数。

现在到你的代码。我很确定您发布的代码不是 C++ 代码,这使得您很难理解您正在尝试做什么。您使用的列表类型也不是 a std::list<>(迭代器的工作方式不同),您Data既可以用作变量(未在代码中定义)也用作类型。

正如有人已经建议的那样,也许你应该开始更容易一些,或者更好的是,为 C++ 初学者买一本好书(我推荐“Accelerated C++”和“Programming P&P using C++”)。

于 2010-06-18T09:49:26.380 回答