顺序容器--字符串操作


  • 对于字符串string的额外操作

    s.substr(pos,n)返回一个string包含从pos开始的n个字符串的拷贝。pos默认为0. n的默认值为s.size()-pos,就是拷贝从pos开始的所有字符
    const char *cp = "Hello world!!!!";
    char noNuLL[] = { 'H', 'i' };
    string s1(cp);
    string s2(noNuLL, 2);
    string s3(noNuLL);//错误字符串需要以/0为结束符
    string s4(cp + 6, 5);
    string s5(s1, 6, 5);
    string p("Helo World!!!");
    string p2 = p.substr(0, 5);
    string p3 = p.substr(5);
    string p4 = p.substr(6, 11);
    cout << p << endl;
    cout << p2 << endl;
    cout << p3 << endl;
    cout << p4 << endl;
    
    字符串操作含义
    s.insert(pos,args)pos可以是下标或者迭代器,或者说所有线性存储容器都支持下标设置
    s.erase(pos,len)删除pos位置上长度为len个字符
    s.append(args)在s末尾添加args然后返回一个s的引用
    s.assign(args)这是一个替换函数。用args替换s中的字符串
    s.replace(range,args)删除s中范围range内的字符并且用args替换
#include<iostream>
#include<string>
#include <vector>
using namespace std;


void replace_string(string&s, const string &oldVal, const string &newVal)
{
    auto l = oldVal.size();
    if (!l)
        return;//表示要查找的字符串为空
    auto iter = s.begin();
    while (iter <= s.end() - 1)
    {
        auto iter1 = iter;
        auto iter2 = oldVal.begin();
        while (iter2 != oldVal.end() && *iter1 == *iter2)
        {
            iter1++;
            iter2++;
        }
        if (iter2 == oldVal.end())
        {
            iter = s.erase(iter, iter1);//由后至前逐个插入
            if (newVal.size())
            {
                iter2 = newVal.end();
                do
                {
                    iter2--;
                    iter2 = s.insert(iter, *iter2);
                } while (iter2 > newVal.begin());
            }
            iter += newVal.size();
        }
        else
            iter++;
    }


}




int main(int argc, char **argv)
{
    //////////////////////////////////////////////////////////////////////////
    //string操作
    const char *cp = "Hello world!!!!";
    char noNuLL[] = { 'H', 'i' };
    string s1(cp);
    string s2(noNuLL, 2);
    string s3(noNuLL);//错误字符串需要以/0为结束符
    string s4(cp + 6, 5);
    string s5(s1, 6, 5);
    string p("Helo World!!!");
    string p2 = p.substr(0, 5);
    string p3 = p.substr(5);
    string p4 = p.substr(6, 11);
    cout << p << endl;
    cout << p2 << endl;
    cout << p3 << endl;
    cout << p4 << endl;
    //string p5 = p.substr(16);//字符串数组越界,抛出异常
    //////////////////////////////////////////////////////////////////////////
    //9.41
    vector<char>vc{ 'g', 'f', 's', 'b', 'a' };
    string s(vc.data(), vc.size());
    cout << s<<endl;
    void input_string(string&s);



    system("pause");
}
//////////////////////////////////////////////////////////////////////////
//高效的处理动态增长的string
//在声明的过程中就直接定义了吗?应该是的,虽然定义与实现要分离但是这样会浪费大量的新建文件的时间,这时候小型文本编辑器就显得很重要了,而不会选择如此臃肿的vs2013
    void input_string(string&s)
    {
        s.reserve(100);
        char c;
        while (cin >> c)
            s.push_back(c);
    }
`markdown-it` 从字符串解析到完成页面渲染的详细流程如下: ### 块结构解析 将一篇 Markdown 文档视为一系列块,块是结构化元素,如段落、块引用、列表、标题、规则和代码块等。块结构的解析优先级高于内联结构,这一步需按顺序处理行。块分为容器块和叶子块,容器块可包含其他块,叶子块不能。`markdown-it` 会根据内置的块级规则或自定义规则来识别文档中的块结构。例如,使用 `block.ruler` 管理块级规则,可通过 `push`、`before` 或 `after` 方法添加自定义规则。以下是添加自定义块级规则的示例代码: ```javascript const MarkdownIt = require('markdown-it'); const md = new MarkdownIt(); const customBlockRule = (state, startLine, endLine, silent) => { // 规则逻辑 return true; }; md.block.ruler.push('custom_block', customBlockRule); ``` ### 内联结构解析 在完成块结构解析后,将段落、标题和其他块结构中的文本行作为内联结构解析。这一步可以并行化,因为一个块元素的内联解析不会影响其他块的内联解析。内联内容包括文本、链接、强调文本、图像、行内代码等。 ### Token 生成 在解析过程中,`markdown-it` 会将 Markdown 字符串转换为一系列 Token。Token 是一种中间表示形式,用于描述 Markdown 文档的结构和内容。例如,当解析到一个标题时,会生成一个表示标题的 Token,包含标题的级别、文本内容等信息。 ### 渲染 根据生成的 Token 以及渲染规则,将其转换为 HTML 字符串。可以通过修改渲染器规则或 Token 来实现自定义渲染。以下是修改渲染器规则的示例代码: ```javascript var defaultRender = md.renderer.rules.link_open || function(tokens, idx, options, env, self) { return self.renderToken(tokens, idx, options); }; md.renderer.rules.link_open = function (tokens, idx, options, env, self) { var aIndex = tokens[idx].attrIndex('target'); if (aIndex < 0) { tokens[idx].attrPush(['target', '_blank']); } else { tokens[idx].attrs[aIndex][1] = '_blank'; } return defaultRender(tokens, idx, options, env, self); }; ``` ### 页面渲染 将生成的 HTML 字符串插入到网页中,完成页面渲染。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值