STL之基础算法(四)

template <class ForwardIterator1, class ForwardIterator2>
inline ForwardIterator1 search(ForwardIterator1 first1, ForwardIterator1 last1,
                               ForwardIterator2 first2, ForwardIterator2 last2)
{
  return __search(first1, last1, first2, last2, distance_type(first1),
                  distance_type(first2));
}

//没看源码之前,还以为会有什么复杂的算法,结果也只是遍历
//如果没有假设(比如有序什么的),STL里的许多算法实现也是挺普通的做法
template <class ForwardIterator1, class ForwardIterator2, class Distance1,
          class Distance2>
ForwardIterator1 __search(ForwardIterator1 first1, ForwardIterator1 last1,
                          ForwardIterator2 first2, ForwardIterator2 last2,
                          Distance1*, Distance2*) {
  Distance1 d1 = 0;
  distance(first1, last1, d1);
  Distance2 d2 = 0;
  distance(first2, last2, d2);


  if (d1 < d2) return last1; //如果第二序列大于第一序列,不可能成为其子序列


  ForwardIterator1 current1 = first1;
  ForwardIterator2 current2 = first2;


  while (current2 != last2) // 我的第一感觉是遍历第一序列,结果人家是遍历第二序列。不过感觉代码写起来应该差不多
    if (*current1 == *current2) { // 如果这个元素相同,调整,以便比对下一个元素
      ++current1;
      ++current2;
    }
    else { //如果这个元素不同
      if (d1 == d2) //如果两序列一样长了,就不可能成功了
        return last1;
      else { //如果两序列不一样长,调整序列标兵
        current1 = ++first1;
        current2 = first2;
        --d1; //已经排序了序列一的一个元素,所以序列一的长度要减 1
      }
    }
  return first1;
}


示例: 
const char S1[] = "Hello, world!";
const char S2[] = "world";
const int N1 = sizeof(S1) - 1;
const int N2 = sizeof(S2) - 1;


const char* p = search(S1, S1 + N1, S2, S2 + N2);
printf("Found subsequence \"%s\" at character %d of sequence \"%s\".\n",
	 S2, p - S1, S1);	
描述:在序列一[first1, last1) 所涵盖的区间中,查找序列二[first2, last2) 的首次出现点。 
思路: 
1.遍历序列二 
2.如果两序列的当前元素一样,都前进 1 
3.否则序列二的迭代器重新指向开始元素,序列一前进 1 ,序列一的长度减 1 
复杂度: 
最坏情况是平方: 最多 (last1 - first1) * (last2 - first2) 次比较。 但最坏情况很少出现。 

平均情况下是线性复杂度 

template <class ForwardIterator, class Integer, class T>
ForwardIterator search_n(ForwardIterator first, ForwardIterator last,
                         Integer count, const T& value) {
  if (count <= 0)
    return first;
  else {
    first = find(first, last, value); // 首先找出 value 第一次出现点
    while (first != last) { // 这里的条件写成 last - first < n 是不是好些?
      Integer n = count - 1; // value 还应该出现 n 次
      ForwardIterator i = first;
      ++i;
      while (i != last && n != 0 && *i == value) {
        ++i;
        --n;
      }
      if (n == 0) // 找到了
        return first;
      else  // 没找到,重新从 i 开始找
        first = find(i, last, value);
    }
    return last;
  }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
"c stl基础及应用"是一本关于STL(Standard Template Library,标准模板库)的基础和应用方面的书籍。STL是C++的一个重要的库,它提供了一套标准模板和算法,用于处理数据结构和容器,例如向量、链表、队列、堆等等。 这本书可以帮助读者全面了解STL基础知识和应用场景。它详细介绍了STL的各种容器、迭代器和算法的使用方法。例如,它会教读者如何创建一个向量,如何在向量中添加和删除元素,如何通过迭代器进行遍历等等。此外,这本书还介绍了STL的常见算法,例如排序、查找和拷贝等。 通过阅读这本书,读者可以学习到如何使用STL来提高程序的效率和可维护性。STL提供了许多高效的数据结构和算法,可以大大简化程序的开发过程。例如,使用STL的排序算法可以让开发者更方便地对数据进行排序操作,节省了编写排序算法的时间和精力。 此外,这本书还提供了一些实际应用的例子,帮助读者将STL的知识应用到实际项目中。这些例子可以帮助读者更好地理解STL的使用,并且在实际编程中能够更灵活地运用STL。 总之,"c stl基础及应用"是一本关于STL基础和应用方面的书籍,它可以帮助读者系统地学习和理解STL的使用方法,并且通过一些实际例子来加强应用能力。如果对STL感兴趣或者需要使用STL来提高编程效率,这本书将是一个很好的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值