c/c++ vector,map,set,智能指针,综合运用的小例子

标准库,智能指针,综合运用的小例子

功能说明:查询单词在文件中出现的次数,如果在同一行出现多次,只算一次。

比如查询单词:你好

输出的结果:

你好 出现了:2次

(行号 2)xxxxxxx 你好

(行号 3)bbb ccc 你好 xxxxx

注意点:代码的46行,必须使用引用。

//非常重要,必须用引用,要不然就会拷贝一个新的set给lines,不是map里的set
auto &lines = wm[word];//lines是shared_ptr

代码:

#include <iostream>
#include <fstream>
#include <sstream>
#include <map>
#include <set>
#include <vector>
#include <string>
#include <memory>

using namespace std;

class QueryResult{
  friend ostream& print(ostream&, const QueryResult&);
public:
  using line_no = vector<string>::size_type;
  QueryResult(string s, shared_ptr<set<line_no>> p,
              shared_ptr<vector<string>> f):
    sought(s), lines(p), file(f){}
private:
  string sought;//查询的单词
  shared_ptr<set<line_no>> lines;//出现的行号
  shared_ptr<vector<string>> file;
};
//QueryResult的友元函数
ostream& print(ostream& os, const QueryResult& qr){
  os << qr.sought << " 出现了:" << qr.lines->size() << "次" << endl;
  for(auto num : *qr.lines){
    os << "\t(行号 " << num + 1 << ")"
       << *(qr.file->cbegin() + num) << endl;
  }
  return os;
}
class TextQuery{
public:
  using line_no = vector<string>::size_type;
  TextQuery(ifstream& is) : file(new vector<string>){
    string text;
    while(getline(is, text)){//读文件的每一行
      file->push_back(text);
      int n = file->size() - 1;//当前行号
      istringstream line(text);//将行文本分解为单词
      string word;
      while(line >> word){
        //非常重要,必须用引用,要不然就会拷贝一个新的set给lines,不是原来的
        auto &lines = wm[word];//lines是shared_ptr
        if(!lines)
          lines.reset(new set<line_no>);
        lines->insert(n);
      }
    }
  }
  QueryResult query(const string &sought) const{
    //如果没有找到sought,返回指向此set的一个智能指针
    static shared_ptr<set<line_no>> nodata(new set<line_no>);
    auto ret = wm.find(sought);
    if(ret == wm.end()){
      return QueryResult(sought, nodata, file);//没有找到
    }
    else{
      return QueryResult(sought, ret->second, file);
    }
  }
private:
  shared_ptr<vector<string>> file;
  map<string, shared_ptr<set<line_no>>> wm;
};
int main(){
  ifstream infile("/home/ys/c++_template/search_text");
  TextQuery tq(infile);
  while(true){
    cout << "输入要查找的单词: q 退出";
    string s;
    if(!(cin >> s) || s == "q")break;
    print(cout, tq.query(s)) << endl;;
  }
}

github完整代码

c/c++ 学习互助QQ群:877684253

本人微信:xiaoshitou5854

原文地址:https://www.cnblogs.com/xiaoshiwang/p/9728555.html

时间: 2024-10-05 05:50:01

c/c++ vector,map,set,智能指针,综合运用的小例子的相关文章

NS3-对象框架之智能指针

title: 03.NS-3的对象框架 之 智能指针 tags: 新建,模板,小书匠 slug: storywriter/upgrade_log grammar_mindmap: true renderNumberedHeading: true grammar_code: true grammar_decorate: true grammar_mathjax: true 一.NS-3的对象框架之智能指针 NS-3提供了一套基于引用计数的智能指针系统,可以使得对象在不再被使用时自动被删除.使用一个

详解Boost库智能指针(shared_ptr &amp;&amp; scoped_ptr &amp;&amp; weak_ptr )

我们先来解释一下什么叫智能指针? 智能指针是利用RAII(在对象的构造函数中执行资源的获取(指针的初始化),在析构函数中释放(delete 指针):这种技法把它称之为RAII(Resource Acquisition Is Initialization:资源获取即初始化))来管理资源. 其本质思想是:将堆对象的生存期用栈对象(智能指针)来管理.也就是当new一个堆对象的时候,立刻用智能指针来接管,具体做法是在构造函数中进行初始化(用一个指针指向堆对象),在析构函数调用delete来释放堆对象.由

C/C++——跟我重写智能指针auto_ptr模版类

第一次使用auto_ptr的时候感觉很好用,但是对内部原理根本不懂,心里不知道这东西到底是个什么东东,总是感觉这东东比较陌生.今天有时间来简单实现一下该类模版auto_ptr,实现了该模版类的主要功能,可以让大家了解一下这个东东内部到底是个什么情况. 栈对象和堆对象的区别: 首先,看一下两种类对象的区别,一个是在栈上分配空间,另一个是在堆上分配空间. 如果看到这里,你不清楚堆和栈的区别.那我也不解释了,自行Google..(如果你想baidu也不拦你) 1.先测试栈上分配的对象 #include

Part6 数组、指针与字符串 6.10 智能指针 6.11 vector对象

6.10 智能指针C++11 提供智能指针的数据类型,对垃圾回收技术提供了一些支持,实现一定程度的内存管理 unique_ptr:不允许多个指针共享资源,可以用标准库中的move函数转移指针shared_ptr:多个指针共享资源weak_ptr:可复制shared_ptr,但其构造或者释放对资源不产生影响 6.11 vector对象为什么需要vector? 封装任何类型的动态数组,自动创建和删除. 数组下标越界检查. 例6-18 中封装的ArrayOfPoints也提供了类似功能,但只适用于一种

C++智能指针梳理

C++智能指针梳理 参考: https://en.wikipedia.org/wiki/Memory_leak (维基百科,内存泄漏) https://en.wikipedia.org/wiki/Resource_leak (维基百科,资源泄漏) http://blog.csdn.net/dangercheng/article/details/12618161(内存泄露和野指针的概念) http://blog.csdn.net/na_he/article/details/7429171 (内存泄

指针辨析:悬垂指针、哑指针、野指针、智能指针

悬垂指针: 1:提出的原因: 请看下面的代码片段: [cpp] view plaincopyprint? int *p=NULL; void main() { int i=10;p=&i; cout<<"第一次:*p = "<<*p<<endl; cout<<"第二次:*p = "<<*p<<endl; } [cpp] view plaincopyprint? int *p=NULL;

C++ 基础知识回顾(string基础、智能指针、迭代器、容器类)

[1] string基础 [1.1] string 的构造 1 #include <iostream> 2 #include <string> 3 4 int main() 5 { 6 using namespace std; 7 8 cout << "1 --- string(const char* s):将string对象初始化为s指向的C风格字符串" << endl; 9 string one("benxintuzi_1&

技术分享会之——智能指针

由于之前也只是了解智能指针,要我说估计只能说个它是干什么的,用不了几分钟. 昨天花了一天时间各种百度,算是对智能指针有了一点了解,这篇文章基本就是这次分享会的PPT的copy,没有底层的东西,多是概念. 我觉得理解智能指针需要了解它发展的三个过程:起因,经过,结果.这篇文章主要讲述的是起因,经过和结果等以后工作了,实际接触了再说吧. 起因: 1.为什么需要智能指针 我们先看两个例子 一:内存泄露 <pre name="code" class="cpp">

COCOS2D-X中的智能指针

Cocos2d-x中所有内存管理方式的基础是引用计数,动态分配一个Ref对象后其引用计数为1,并通过retain和release来增持和减少其引用计数.引用计数本身并不能帮助我们进行内存管理. 为了正确地释放对象的内存,Cocos2d-x使用Objective-C里面的自动回收池的机制来管理对象内存的释放.Autorelease有点类似于一个共享的"智能指针",该"智能指针"的作用域为一帧,该帧结束后,它将释放自己的引用计数,此时,如果该对象没有被其他"共