首页 > 其他分享 >【如何实现tinySTL】实现小型的vector string 将 string 放入vector中

【如何实现tinySTL】实现小型的vector string 将 string 放入vector中

时间:2023-05-21 18:32:23浏览次数:32  
标签:std string Ostr typename tinySTL vector static type cout

  • 语法细节
  • 类内的静态(static)成员在类外定义的时候不加static
  • typename的作用
  • 1. 一种是在声明模板类、模板函数的参数的时候
  • 2. 还有一种是在取别名的时候
  • std::enable_if 的几种用法
  • 定义
  • cin cout endl都是什么
  • endl 是一个函数 参数是basic_ostream
  • cin cout 是两个对象
  • 【在指定的地址构造对象】placement new
  • 【STL内存拷贝】std::memmove

想法来源

为了巩固C++知识,在知乎上调研了一番之后
决定采用陈硕前辈的想法
计划自己实现一个简易版本的vector
再实现一个string类
然后将string 放进vector里面
知乎
如何从零开始手写一个tiny STL? - 陈硕的回答 - 知乎
https://www.zhihu.com/question/53085291/answer/133458242

GitHub仓库地址

语法细节

类内的静态(static)成员在类外定义的时候不加static

包括静态成员函数,在类外实现的时候不需要再加上static了
否则会报错

每一个cpp文件最后都编程了一个翻译单元

对于静态变量
因为在cpp的翻译单元总,静态变量只在一个单元内部可见
但是类内的static却要在其他的cpp中也可以使用,这样在类外定义这个变量的时候
就不能在外面继续加上static了 否在就没法和cpp文件里面的static变量区分了

对于静态函数
也是如此
加上static之后,一个cpp中定义了函数,在其他的cpp中就访问不到了

可能的原因


typename的作用

typename有两种用发,

1. 一种是在声明模板类、模板函数的参数的时候

2. 还有一种是在取别名的时候

Eg1:
template<typename T>
class vector {}

Eg2:
using value_type = typename allocator<T>::value_type;

告诉编译器 allocator<T>::value_type 是一个类型名称

使用 typename 的作用就是告诉 c++ 编译器,typename 后面的字符串为一个类型名称,而不是成员函数或者成员变量,这个时候如果前面没有 typename,编译器没有任何办法知道 T::LengthType 是一个类型还是一个成员名称(静态数据成员或者静态函数),所以编译不能够通过。
std::enable_if 的几种用法

定义

template <bool, typename T=void>
struct enable_if {
};
 
template <typename T>
struct enable_if<true, T> {
  using type = T;
};

由上可知,只有当第一个模板参数为 true 时,type 才有定义,否则使用 type 会产生编译错误,并且默认模板参数可以让你不必指定类型。下面说说它的几种使用方法


cin cout endl都是什么

endl 是一个函数 参数是basic_ostream

源码

// MANIPULATORS
template <class _Elem, class _Traits>
basic_ostream<_Elem, _Traits>& __CLRCALL_OR_CDECL endl(
    basic_ostream<_Elem, _Traits>& _Ostr) { // insert newline and flush stream
    _Ostr.put(_Ostr.widen('\n'));
    _Ostr.flush();
    return _Ostr;
}

向_Ostr中加了一个\n
之后刷新了流

cin cout 是两个对象

__PURE_APPDOMAIN_GLOBAL extern istream cin;
__PURE_APPDOMAIN_GLOBAL extern ostream cout;

分别重载了>> <<

【在指定的地址构造对象】placement new

#include <iostream>

using namespace std;

int main()
{
    int a = 10;
    int* p = &a;
    ::new ((void*)p) int(2);
    std::cout << a << std::endl;
    return 0;
}

【STL内存拷贝】std::memmove

#include <iostream>
#include <cstring>

int main()
{
    char str[] = "1234567890";
    std::cout << str << '\n';
    std::memmove(str + 4, str, 3); // copies from [4, 5, 6] to [5, 6, 7]
    std::cout << str << '\n';
}


标签:std,string,Ostr,typename,tinySTL,vector,static,type,cout
From: https://blog.51cto.com/liyunhao/6320019

相关文章

  • QT 字符串和数字拼接 QString int 拼接 显示在 label 标签中
    变量:i=0;拼接后显示到界面的label标签中。方法一:QStringsucc=QString("连接成功:%1").arg(i++);ui->label->setText(succ);方法二:QStringsucc=QString("%1%2").arg("连接成功:").arg(i++);ui->label->setText(succ);效果......
  • Jmeter函数助手16-FiletoString
    FiletoString函数用于获取文本文件的值,一次读取一行,可读取多个文件。输入文件的全路径:填入文件路径存储结果的变量名(可选)Startfilesequencenumber(opt):初始序列Finalfilesequencenumber(opt):终止序列1、StringFromFile函数跟组件CSV数据文件设置的区别是:CSV数据......
  • Jmeter函数助手15-FiletoString
    FiletoString函数用于一次读取整个文件值。输入文件的全路径:填入文件路径Fileencodingifnottheplatformdefault(opt):读取文件的编码格式,不传则默认使用系统格式存储结果的变量名(可选)1、首先我的文件内容是4行2列,如下2、调用FiletoString函数会一次性输入多行多列的......
  • 总结一下常见String类的方法
    String常用方法intlength():返回字符串的长度:returnvalue.lengthcharcharAt(intindex):返回某索引处的字符returnvalue[index]booleanisEmpty():判断是否是空字符串:returnvalue.length==0StringtoLowerCase():使用默认语言环境,将String中的所有字符转换为小写Strin......
  • pta_【CPP0039】vector应用测试
    #include<iostream>#include<vector>#include<algorithm>usingnamespacestd;intmain(void){inti,a[10],b;for(i=0;i<10;i++){scanf("%d",&a[i]);}scanf("%d",&b);//插入的数{vector<int&......
  • #820 B Decode String
    昨天在cf上面做的一个字符串处理的题目debug了很久终于做出来了,很开心题目点我下面就是代码#include<stdio.h>#include<string.h>#include<stdlib.h>intmain(){ chararr[99];//第一个字符数组用来存储数字字符串 charbrr[99];//第二个数组用来存储得到的字符串......
  • 《C++ string类》
    1.string类常见的构造函数1)string(constchar*s):将string对象初始化为s指向的字符串stringstr("Hello!"); 2)string(size_typen,charc):创建一个包含n个元素的string对象,其中每个元素都被初始化为字符cstringstr(10,'a'); 3)string(conststring&str)......
  • JSON.parse和JSON.stringify方法详解
    1.JSON.parse()用于从一个字符串中解析出json对象<!--作者:zhangfan页面名称:JSON.parse()、JSON.stringify()使用方法--><template><divid="product-list-one"><button@click="jsonParse()">执行jsonParse</button></div><......
  • qs.parse()、qs.stringify()使用方法
    1.简介qs是一个增加了一些安全性的查询字符串解析和序列化字符串的库。2.qs主要有两个方法:qs.parse()将URL解析成对象的形式<!--作者:zhangfan页面名称:qs.parse()、qs.stringify()使用方法--><template><divid="product-list-one"><button@click="qsParse()">执行q......
  • testng数据驱动返回map和string两种方式
    1.yaml数据展示user.yaml#登录接口正确的用户名密码-'uri':'/console/index.html#/login''username':'liqiang1''password':'111111'#错误的接口数据-'uri':'/console/index.html#/login'......