【问题标题】:Searching std::vector of class objects by class attribute (eg. name)按类属性(例如名称)搜索类对象的 std::vector
【发布时间】:2016-12-14 08:18:07
【问题描述】:

性能/安全检查是否有任何差异 使用

的向量元素
  1. 带有迭代器的for循环

对比

  1. std:find_if(...)?

1. for循环

// 1. for loop  
for (llvm::SmallVectorImpl<myClass>::const_iterator it = v.begin();
     it != v.end();
     ++it) {
    if (it->getName() == Name) {
        // found element
        // do smth...
        break;
    }
}

对比

2。 std:find_if

// 2. find if
llvm::SmallVectorImpl<myClass>::const_iterator it
    = std::find_if(v.begin(),
                   v.end(),
                   StringCheck<llvm::StringRef>(Name));
if (it != v.end()) {
    // found element
    // do smth...
}

// StringCheck defined in header...

template <class T>
struct StringCheck{
    StringCheck(const T &s) : s_(s) {}
    bool operator()(const myClass &obj) const
    {
        return obj.getName() == s_;
    }
private:
    const T &s_;
};

【问题讨论】:

  • “安全”没有什么不同。对于性能,您必须进行基准测试。
  • 最终,std::find_if 将迭代向量,所以我猜没有性能差异。
  • 那里may be a performance difference either way. 任何这样的差异都小到足以成为过早的优化,除非您实际上已将循环确定为瓶颈,并且在这种情况下,您需要自己进行分析。
  • 真正我能看到的唯一区别是迭代器循环会找到所有情况,除非您使用中断,find_if 将在第一次出现时隐式停止。
  • 你认为std::find_if是如何实现的——黑魔法?实际上,您无需猜测 - 您可以查看实现,它与您的编译器一起提供。你会在那里找到一个带有迭代器的循环。

标签: c++ vector c++03


【解决方案1】:

找到匹配项后,您的 for 循环将继续迭代。如果可能有多个匹配项并且您希望为每个匹配项运行代码,这可能是一件好事,如果您想在找到匹配项后停止并且在大型容器中尽早找到匹配项,这可能是一件坏事。

【讨论】:

  • 在我的用例中,我想在第一次匹配后完成迭代,所以我添加了 break;在 for 循环中。
猜你喜欢
  • 1970-01-01
  • 2022-01-11
  • 2023-03-26
  • 1970-01-01
  • 2021-12-31
  • 2013-12-06
  • 1970-01-01
  • 2013-03-09
相关资源
最近更新 更多