Essential c++第三章笔记

①list容器的元素以一组指针相互链接:前向指针寻址下一个元素,回向元素用来寻址上一个元素

②每个标准容器都会有提供begin()的操作函数并返回一个开始位置的迭代器,另一个end()函数也会返回最后一个元素的下一个元素的迭代器

③const vector的迭代器需要const_iterator类型来接收,例:vector::const_iterator iter = cs.begin()

④如果需要在最前端or最后端进行安插删除可使用deque容器效率更高

⑤pop_back与pop_front俩个函数并不会返回被删除的元素值,因此,想要读取最前端的值应使用front,最末端用back

⑥list并不支持迭代器的偏移运算

⑦产生特定大小的容器,每个元素都以其默认值作为初值
list ilist(123); vector svec(32);
产生特定大小并为每个元素指定初值
vector ilist(10, -1) list slist(16, “hello”)

⑧push_front和push_back皆属于特殊化的安插,每个容器的安插函数支持4种变形
iterator insert(iterator p, eleType v)将v安插与p之前,返回一个iterator,指向被安插的元素
void insert(interator p, int c, eleType v)可在p之前安插c个元素,这些元素的值皆和v相同
void insert(interator p, interator f, interator l)可在p之前安插(f, l)所标识的各个元素
interator insert(interator p)可在p之前插入元素,此元素初值为其所属类型的默认值
抹除函数支持2个变形
interator erase(interator p)可抹除p所指的元素
interator erase(interator f, interator l)可抹除[f, l]范围内的元素
这俩个抹除函数皆指向被删除的下一个位置

⑨标准程序库提供俩个绑定配接器,bind1st会将指定的数绑定至第一操作数,bind2nd则会绑定至第二操作数

⑩有一种可逆转函数对象真伪值的配接器,not1可逆转一元函数对象的真伪,not2可逆转二元函数对象的真伪

①①map被定义成一对数值,keyvalue,key扮演索引角色,另一个值是value

①②set由一群keys组合而成,如果想知道某值是否存在于某个集合内,就可以使用set,key值set只能存储一份,想要存多份相同key必须使用multiset,使用count操作函数即可检查目标是否存在于set中

<练习>
3.1

#include <map>
#include <set>
#include <string>
#include <iostream>
#include <fstream>
using namespace std;
int main(void)
{
    map<string, int> world;
    ifstream fp("word.txt");
    if(!fp)
    {
        cerr << "打开文件失败" << endl;
        return 1;
    }
    string word;
    string exc[6] = {"a", "an", "or", "the", "and", "but"};
    set<string> excword(exc, exc + 6);
    while(fp >> word)
    {
        if(excword.count(word))
            continue;
        world[word]++;
    }
    map<string, int>::iterator it = world.begin();
    for(; it != world.end(); it++)
        cout << "Key: " << it->first << ' '
             << "Value: " << it->second << endl;
    return 0;
}

3.2

#include <string>
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
bool sizecom(string, string);
int main(void)
{
    ifstream fp("word.txt");
    if(!fp)
    {
        cerr << "文件读取失败" << endl;
        return 1;
    }
    vector<string> word;
    string temp;
    while(fp >> temp)
        word.push_back(temp);
    sort(word.begin(), word.end(), sizecom);
    for(int i = 0; i < word.size(); i++)
        cout << word[i] << ' ';
    return 0;
}
bool sizecom(string str1, string str2)
{
    return str1.size() < str2.size() ? true : false;
}

3.3

#include <string>
#include <iostream>
#include <map>
#include <fstream>
#include <vector>
using namespace std;
int main(void)
{
    map<string, vector<string>> member;
    ifstream fp("word.txt");
    if(!fp)
    {
        cerr << "文件打开失败" << endl;
        return 1;
    }
    string fname, temp;
    fp >> fname;
    while(fp >> temp)
        member[fname].push_back(temp);
    map<string, vector<string>>::iterator it = member.begin();
    for(int i = 0; i < member[fname].size(); i++)
        cout << it->first << '-' << it->second[i] << ' ';
    return 0;
}

3.4

#include <string>
#include <iostream>
#include <fstream>
#include <iterator>
#include <vector>
#include <algorithm>
using namespace std;
int main(void)
{
    ofstream fp("word.txt");
    if(!fp)
    {
        cerr << "文件打开失败" << endl;
        return 1;
    }
    istream_iterator<int> is(cin);
    istream_iterator<int> eof;
    vector<int> text;
    copy(is, eof, back_inserter(text));
    sort(text.begin(), text.end());
    ostream_iterator<int> os(fp, " ");
    copy(text.begin(), text.end(), os);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值