C++中用模板实现vector/map值存在性检查是否影响性能?
C++容器包含检查模板的性能疑问
我是一名C++初学者,正在寻找可独立于数据类型检查vector或map是否包含指定值的模板,找到了以下代码:
template <typename Container, typename Value> bool vector_contains(const Container& c, const Value& v) { return std::find(std::begin(c), std::end(c), v) != std::begin(c); } template< typename container, typename key > auto map_contains(container const& c, key const& k) -> decltype(c.find(k) != c.end()) { return c.find(k) != c.end(); }
我的疑问是,使用这类模板进行此类验证是否会对性能产生影响?
解答
这类模板不会带来任何运行时性能损失,原因如下:
- 模板是编译期实例化:C++模板在编译阶段会根据传入的容器类型展开成具体代码,最终生成的机器码和你直接手写
std::find(std::begin(c), std::end(c), v) != std::end(c)或者c.find(k) != c.end()完全等价。编译器会对展开后的代码做相同的优化(比如内联函数、循环优化等),不会有额外的函数调用开销。 - 仅为语法层面的封装:这两个模板只是把重复的判断逻辑打包起来,提供更统一、简洁的调用方式,没有添加任何额外的运行时操作。
另外需要提醒你:vector_contains函数里的判断逻辑存在错误,应该写成!= std::end(c)而非!= std::begin(c)。原代码会导致当目标值恰好是容器的第一个元素时,错误返回false,不符合“包含”的判断逻辑。
内容的提问来源于stack exchange,提问作者Cesar
相关产品推荐
相关产品推荐

