C++中vector的使用

2023-11-12

向量std::vector是一种对象实体,能够容纳许多各种类型相同的元素,包括用户自定义的类,因此又被称为序列容器。与string相同,vector同属于STL(Standard Template Library)中的一种自定义的数据类型,可以广义上认为是数组的增强版,相当于一个动态数组。

         在使用它时,需要包含头文件vector: #include <vector>

         vector是一个类模板,不是一种数据类型:

template<class T, class Alloc = allocator<T> > class vector;
 vector可以存放任何类型的对象(但必须是同一类对象)。vector对象可以在运行时高效地添加元素。vector中元素是连续存储的,所以除了能够通过迭代器访问外,还可以通过常规的指针偏移量访问元素。换句话说,可以将指向vector元素的指针传入以指向数组元素的指针作为参数的函数。

         vector会在需要时自动调整所占内存的大小。与对应的静态数组相比,vector 所占的内存通常要更多,因为它还分配了额外的内存以应对将来可能的扩张。于是,vector 就不必在每次插入元素时都重新分配一次内存了,除非这块预留的内存用尽。已分配内存的总大小可以通过 capacity() 函数查询。所占的额外的内存可以通过调用 shrink_to_fit()(c++11) 返还给系统。

从性能方面考虑,内存重分配操作的代价通常很大。如果事先知道元素个数,可以使用 reserve() 函数消除重新分配操作。

         vector值初始化:

(1)、如果没有指定元素初始化,标准库自行提供一个初始化值进行初始化;

(2)、如果保存的是含有构造函数的类类型的元素,标准库使用该类型的构造函数初始化;

(3)、如果保存的是没有构造函数的类类型的元素,标准库产生一个带初始值的对象,使用这个对象进行值初始化。

vector容器内存放的所有对象都是经过初始化的。如果没有指定存储对象的初始值,那么对于内置类型将用0初始化,对于类类型将调用其默认构造函数进行初始化(如果有其它构造函数而没有默认构造函数,那么此时必须提供元素初始值才能放入容器中)。

一个容器就是一些特定类型对象的集合。顺序容器(sequential container)为程序员提供了控制元素存储和访问顺序的能力。这种顺序不依赖于元素的值,而是与元素加入容器时的位置相对应。

         标准库中的顺序容器包括:

         (1)、vector:可变大小数组。支持快速随机访问。在尾部之外的位置插入或删除元素可能很慢。

         (2)、deque:双端队列。支持快速随机访问。在头尾位置插入/删除速度很快。

         (3)、list:双向链表。只支持双向顺序访问。在list中任何位置进行插入/删除操作速度都很快。

         (4)、forward_list:单向链表。只支持单向顺序访问。在链表任何位置进行插入/删除操作速度都很快。

         (5)、array:固定大小数组。支持快速随机访问。不能添加或删除元素。

         (6)、string:与vector相似的容器,但专门用于保存字符。随机访问快。在尾部插入/删除速度快。

         除了固定大小的array外,其它容器都提供高效、灵活的内存管理。我们可以添加和删除元素,扩张和收缩容器的大小。容器保存元素的策略对容器操作的效率有着固定的,有时是重大的影响。在某些情况下,存储策略还会影响特定容器是否支持特定操作。

         例如,string和vector将元素保存在连续的内存空间中。由于元素是连续存储的,由元素的下标来计算其地址是非常快速的。但是,在这两种容器的中间位置添加或删除元素就会非常耗时:在一次插入或删除操作后,需要移动插入/删除位置之后的所有元素,来保持连续存储。而且,添加一个元素有时可能还需要分配额外的存储空间。在这种情况下,每个元素都必须移动到新的存储空间中。

         list和forward_list两个容器的设计目的是令容器任何位置的添加和删除操作都很快速。作为代价,这两个容器不支持元素的随机访问:为了访问一个元素,我们只能遍历整个容器。而且,与vector、deque和array相比,这两个容器的额外内存开销也很大。

         deque是一个更为复杂的数据结构。与string和vector类似,deque支持快速的随机访问。与string和vector一样,在deque的中间位置添加或删除元素的代价(可能)很高。但是,在deque的两端添加或删除元素都是很快的,与list或forward_list添加删除元素的速度相当。

         forward_list和array是新C++标准增加的类型。与内置数组相比,array是一个种更安全、更容易使用的数组类型。与内置数组类似,array对象的大小是固定的。因此,array不支持添加和删除元素以及改变容器大小的操作。forward_list的设计目标是达到与最好的手写的单向链表数据结构相当的性能。因此,forward_list没有size操作,因为保存或计算其大小就会比手写链表多出额外的开销。对其他容器而言,size保证是一个快速的常量时间的操作。

         通常,使用vector是最好的选择,除法你有很好的理由选择其他容器。

         以下是一些选择容器的基本原则:

         (1)、除法你有很好的理由选择其他容器,否则应该使用vector;

         (2)、如果你的程序有很多小的元素,且空间的额外开销很重要,则不要使用list或forward_list;

         (3)、如果程序要求随机访问元素,应使用vector或deque;

         (4)、如果程序要求在容器的中间插入或删除元素,应使用list或forward_list;

(5)、如果程序需要在头尾位置插入或删除元素,但不会在中间位置进行插入或删除操作,则使用deque;

(6)、如果程序只有在读取输入时才需要在容器中间位置插入元素,随后需要随机访问元素,则:首先,确定是否真的需要在容器中间位置添加元素。当处理输入数据时,通常可以很容器地向vector追加数据,然后再调用标准库的sort函数来重排容器中的元素,从而避免在中间位置添加元素。如果必须在中间位置插入元素,考虑在输入阶段使用list,一旦输入完成,将list中的内容拷贝到一个vector中。

如果你不确定应该使用哪种容器,那么可以在程序中只使用vector和list公共的操作:使用迭代器,不使用下标操作,避免随机访问。这样,在必要时选择使用vector或list都很方便。

一般来说,每个容器都定义在一个头文件中,文件名与类型名相同。即,deque定义在头文件deque中,list定义在头文件list中,以此类推。容器均定义为模板类。

顺序容器几乎可以保存任意类型的元素。特别是,我们可以定义一个容器,其元素的类型是另一个容器。这种容器的定义与任何其他容器类型完全一样:在尖括号中指定元素类型(此种情况下,是另一种容器类型)。

下面是测试代码vector.cpp:

#include <vector>
#include <iostream>
#include <assert.h>

#include "vector.hpp"

int test_vector_init()
{
	std::vector<int> a; // 声明一个int型向量a,size为0
	std::vector<int> b(10); // 声明一个初始size为10的向量
	std::vector<int> c(10, 1); // 声明一个初始size为10且初始值都为1的向量
	std::vector<int> d(b); // 声明并用向量b初始化向量d
	std::vector<int> e(c.begin(), c.begin() + 3); // 将c向量中从第0个到第2个(共3个)作为向量e的初始值,size为3

	int n[] = { 1, 2, 3, 4, 5 };
	std::vector<int> f(n, n + 5); // 将数组n的前5个元素作为向量f的初值,size为5
	std::vector<int> g(&n[1], &n[4]); // 将n[1] - n[4]范围内的元素作为向量g的初值,size为3

	std::vector<std::string> v(5, "hello");
	std::vector<std::string> v2(v.begin(), v.end());
	assert(v == v2);

	assert(v.begin() + v.size() == v.end());
	assert(v.end() - v.size() == v.begin());

	std::vector<int> array{ 9, 7, 5, 3, 1 };
	std::cout << "array size: "<< array.size() << std::endl; // 5

	return 0;
}

int test_vector_access()
{
	int n[10];
	for (int i = 0; i < 10; i++) {
		n[i] = i;
	}

	std::vector<int> a(n, n + 10);

	// 对其中部分元素进行输入
	std::cin >> a[2];
	std::cin >> a[5];
	std::cin >> a[6];

	// 输出
	for (int i = 0; i < a.size(); i++) {
		std::cout << a[i] << " ";
	}
	std::cout << std::endl;

	// 使用遍历器(又称迭代器)进行输出
	// vector类的迭代器除了支持通用的前缀自增运算符外,还支持算术运算:it + n、it - n、it2 - it1
	std::vector<int>::iterator t;
	for (t = a.begin(); t != a.end(); t++) {
		std::cout << *t << " ";
	}
	std::cout << std::endl;

	for (std::vector<int>::const_iterator p = a.begin(); p != a.end(); p++) {
		std::cout << *p << " ";
	}
	std::cout << std::endl;

	size_t i = 0;
	int* x = a.data(); //返回指向内存中数组第一个元素的指针
	*x = -111;
	std::cout << "a[0]: " << a[0] << std::endl; // -111

	return 0;
}

int test_vector_operation()
{
	int n[10], m[15];
	for (int i = 0; i < 10; i++) {
		n[i] = i;
		m[i] = i + 20;
	}

	std::vector<int> a(n, n + 10);
	std::vector<int> b(m, m + 15);
	std::vector<int> x;
	x = a; // 赋值

	std::cout << "x size: "<<a.size() << std::endl; // 获取向量中的元素个数, 10
	std::cout << "x capacity: " << x.capacity() << std::endl; // 返回当前存储空间能够容纳的元素数,容器x能够存储的元素个数,10 (x.capacity() >= x.size())
	std::cout << "x max size: " << x.max_size() << std::endl; // 容器x能容纳的最大元素个数, 4611686018427387903
	x.reserve(15); // 预留存储空间,确保x.capacity() >= 15
	std::cout << "x capacity after reserve: " << x.capacity() << std::endl; // 15
	x.shrink_to_fit();
	x.resize(5); // 改变容器中可存储元素的个数,确保返回后,有x.size() == 5, 如果之前x.size() < 5, 那么用默认值补全
	std::cout << "x size after resize: " << x.size() << std::endl; // 5

	std::vector<int>::reference ref1 = b.front(); // 返回容器中第一个元素的引用(容器必须非空), 20
	std::vector<int>::reference ref2 = x.back(); // 返回容器中最后一个元素的引用(容器必须非空), 4
	int value = b[5]; // 返回下标为5的元素的引用(下标从0开始,如果下标不正确,则属于未定义行为), 25
	std::vector<int>::reference ref3 = b.at(5); // 返回下标为pos的元素的引用;如果下标不正确,则抛出异常, 25
	x.push_back(-100); // 将元素添加到容器末尾,向容器末尾添加一个元素
	value = x[x.size() - 1]; // -100
	std::cout << "x size after push_back: " << x.size() << std::endl; // 6
	x.pop_back(); // 删除最后一个元素, 弹出容器中最后一个元素(容器必须非空)
	value = x[x.size() - 1]; // 4
	std::cout << "x size after pop_back: " << x.size() << std::endl; // 5

	x.assign(10, -1); // 赋值,用指定元素序列替换容器内所有元素
	std::cout << "x size after assign: " << x.size() << std::endl; // 10
	std::cout << "x[0]: " << x[0] << std::endl; // -1

	std::cout << "a is empty: "<< a.empty() << std::endl; // 判断向量是否为空, 0
	std::cout << "a size: " << a.size() << std::endl; // 获取向量中的元素个数, 10
	a.clear(); // 删除全部内容, 清空向量中的元素,相当于调用erase(begin(), end())
	std::cout << "size after clear: " << a.size() << std::endl; // 0

	std::vector<int> c;
	c = b; // 将b向量复制到c向量中

	std::cout << "a == b ?: " << (a == b) << std::endl; // == 、 != 、>、 >= 、<、 <= , 采用字典排序策略比较,a向量与b向量比较, 相等则返回1, 0
	std::cout << "c == b ?: " << (c == b) << std::endl; // == 、 != 、>、 >= 、<、 <= , 采用字典排序策略比较,c向量与b向量比较, 相等则返回1, 1

	// 插入和删除操作将发生元素的移动(为了保持连续存储的性质),所以之前的迭代器可能失效
	// 任何改变容器大小的操作都可能造成以前的迭代器失效
	std::cout << "b size: " << b.size() << std::endl; // 15
	b.insert(b.begin(), -1); // 将-1插入到向量b的起始位置前
	std::cout << "b[0]: " << b[0] << std::endl; // -1
	std::cout << "b size: " << b.size() << std::endl; // 16

	b.insert(b.begin() + 5, 3, -1); //将-1分别插入到向量元素位置的5-8处(共3个元素)
	for (int i = 0; i < b.size(); i++) {
		std::cout << b[i] << "  "; // -1 20 21 22 23 -1 -1 -1 24 25 ...
	}
	std::cout<<std::endl;

	std::vector<int> d(5, 1);
	std::vector<int> e(10);
	e.insert(e.begin(), d.begin(), d.end()); //将d.begin(), d.end()之间的全部元素插入到e.begin()前
	for (int i = 0; i < e.size(); i++) {
		std::cout << e[i] << "  "; // 1 1 1 1 1 0 0 0 ...
	}
	std::cout << std::endl;

	std::cout << "b size: " << b.size() << std::endl; // 19
	b.erase(b.begin()); // 将起始位置的元素删除
	std::cout << "b size: " << b.size() << std::endl; // 18
	b.erase(b.begin(), b.begin() + 3); // 将(b.begin(), b.begin()+3)之间的元素删除
	std::cout << "b size: " << b.size() << std::endl; // 15

	b.swap(c); // 交换vector的内容, a向量与c向量进行交换
	for (int i = 0; i < b.size(); i++) {
		std::cout << b[i] << "  ";
	}
	std::cout << std::endl;

	for (int i = 0; i < c.size(); i++) {
		std::cout << c[i] << "  ";
	}
	std::cout << std::endl;

	return 0;
}

int test_vector_two_dimension()
{
	// reference: http://www.cnblogs.com/mr-wid/archive/2013/01/22/2871105.html

	std::vector< std::vector<int> > b(10, std::vector<int>(5, -1));

	// 对部分数据进行输入
	std::cin >> b[1][1];
	std::cin >> b[2][2];
	std::cin >> b[3][3];

	// 全部输出
	for (int m = 0; m < b.size(); m++) { //b.size()获取行向量的大小
		for (int n = 0; n < b[m].size(); n++) { //获取向量中具体每个向量的大小
			std::cout << b[m][n] << "  ";
		}
		std::cout << std::endl;
	}

	return 0;
}
主要参考文献:

1. https://software.intel.com/zh-cn/blogs/2011/08/10/c-vector

2. http://zh.cppreference.com/w/cpp/container/vector 

3. http://www.cplusplus.com/reference/vector/vector/


GitHubhttps://github.com/fengbingchun/Messy_Test

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++中vector的使用 的相关文章

  • C++11中std::condition_variable的使用

  • C++11中enum class的使用

    枚举类型 enumeration 使我们可以将一组整型常量组织在一起 和类一样 每个枚举类型定义了一种新的类型 枚举属于字面值常量类型 C 包含两种枚举 限定作用域的和不限定作用域的 这里主要介绍限定作用域的 不限定作用域的使用可以参考 h
  • C++中static_cast/const_cast/dynamic_cast/reinterpret_cast的区别和使用

    C风格的强制转换较简单 如将float a转换为int b 则可以这样 b int a 或者b int a C 类型转换分为隐式类型转换和显示类型转换 隐式类型转换又称为标准转换 包括以下几种情况 1 算术转换 在混合类型的算术表达式中 最
  • C和C++安全编码笔记:整数安全

    5 1 整数安全导论 整数由包括0的自然数 0 1 2 3 和非零自然数的负数 1 2 3 构成 5 2 整数数据类型 整数类型提供了整数数学集合的一个有限子集的模型 一个具有整数类型的对象的值是附着在这个对象上的数学值 一个具有整数类型的
  • C语言中的弱符号与强符号介绍

    弱符号 Weak symbol 是链接器 ld 在生成ELF Executable and Linkable Format 缩写为ELF 可执行和可链接格式 是一种用于可执行文件 目标文件 共享库和核心转储的标准文件格式 ELF文件有两种索
  • C和C++安全编码笔记:动态内存管理

    4 1 C内存管理 C标准内存管理函数 1 malloc size t size 分配size个字节 并返回一个指向分配的内存的指针 分配的内存未被初始化为一个已知值 2 aligned alloc size t alignment siz
  • C++11中头文件atomic的使用

    原子库为细粒度的原子操作提供组件 允许无锁并发编程 涉及同一对象的每个原子操作 相对于任何其他原子操作是不可分的 原子对象不具有数据竞争 data race 原子类型对象的主要特点就是从不同线程访问不会导致数据竞争 因此从不同线程访问某个原
  • 提高C++性能的编程技术笔记:多线程内存池+测试代码

    为了使多个线程并发地分配和释放内存 必须在分配器方法中添加互斥锁 全局内存管理器 通过new 和delete 实现 是通用的 因此它的开销也非常大 因为单线程内存管理器要比多线程内存管理器快的多 所以如果要分配的大多数内存块限于单线程中使用
  • 提高C++性能的编程技术笔记:引用计数+测试代码

    引用计数 reference counting 基本思想是将销毁对象的职责从客户端代码转移到对象本身 对象跟踪记录自身当前被引用的数目 在引用计数达到零时自行销毁 换句话说 对象不再被使用时自行销毁 引用计数和执行速度之间的关系是与上下文紧
  • C++中vector的使用

    向量std vector是一种对象实体 能够容纳许多各种类型相同的元素 包括用户自定义的类 因此又被称为序列容器 与string相同 vector同属于STL Standard Template Library 中的一种自定义的数据类型 可
  • C++中typeid的使用

    RTTI Run TimeType Information 运行时类型信息 它提供了运行时确定对象类型的方法 在C 中 为了支持RTTI提供了两个操作符 dynamic cast和typeid The typeid operator pro
  • CSV文件简介及C++实现

    逗号分隔值 Comma Separated Values CSV 有时也称为字符分隔值 因为分隔字符也可以不是逗号 其文件以纯文本形式存储表格数据 数字和文本 纯文本意味着该文件是一个字符序列 不含必须象二进制数字那样被解读的数据 CSV文
  • 概率论中伯努利分布(bernoulli distribution)介绍及C++11中std::bernoulli_distribution的使用

    Bernoulli分布 Bernoulli distribution 是单个二值随机变量的分布 它由单个参数 0 1 给出了随机变量等于1的概率 它具有如下的一些性质 P x 1 P x 0 1 P x x x 1 1 x Ex x Var
  • C++11中thread_local的使用

    C 11中的thread local是C 存储期的一种 属于线程存储期 存储期定义C 程序中变量 函数的范围 可见性 和生命周期 C 程序中可用的存储期包括auto register static extern mutable和thread
  • C++/C++11中头文件iterator的使用

  • C++11中std::shared_future的使用

    C 11中的std shared future是个模板类 与std future类似 std shared future提供了一种访问异步操作结果的机制 不同于std future std shared future允许多个线程等待同一个共
  • C++17中utf-8 character literal的使用

    一个形如42的值被称作字面值常量 literal 这样的值一望而知 每个字面值常量都对应一种数据类型 字面值常量的形式和值决定了它的数据类型 由单引号括起来的一个字符称为char型字面值 双引号括起来的零个或多个字符则构成字符串型字面值 字
  • C++中std::sort/std::stable_sort/std::partial_sort的区别及使用

    某些算法会重排容器中元素的顺序 如std sort 调用sort会重排输入序列中的元素 使之有序 它默认是利用元素类型的 lt 运算符来实现排序的 也可以重载sort的默认排序 即通过sort的第三个参数 此参数是一个谓词 predicat
  • Linux下getopt函数的使用

    getopt为解析命令行参数函数 它是Linux C库函数 使用此函数需要包含系统头文件unistd h getopt函数声明如下 int getopt int argc char const argv const char optstri
  • 提高C++性能的编程技术笔记:单线程内存池+测试代码

    频繁地分配和回收内存会严重地降低程序的性能 性能降低的原因在于默认的内存管理是通用的 应用程序可能会以某种特定的方式使用内存 并且为不需要的功能付出性能上的代价 通过开发专用的内存管理器可以解决这个问题 对专用内存管理器的设计可以从多个角度

随机推荐

  • LDA(Latent Dirichlet Allocation)主题模型算法

    LDA Latent Dirichlet Allocation 主题模型算法 LDA整体流程 先定义一些字母的含义 文档集合D topic集合T D中每个文档d看作一个单词序列 lt w1 w2 wn gt wi表示第i个单词 设d有n个单
  • const(一):(转) 一个函数名后面加const表示什么意思

    http zjw86212 blog 163 com blog static 116692085200910394324880 const用在成员函数后 主要是针对类的const对象 如 class Text public void pri
  • 嵌入式Linux开发环境搭建-2-制作编译工具

    嵌入式Linux开发环境搭建 2 制作编译工具 一 安装基本开发环境 1 1 build essential安装 1 2 bison和flex 4 3 安装C函数库的man手册 二 安装交叉编译工具链 2 1 相关软件下载 2 2 修改一个
  • 使用wxWidgets的wxGenericAboutDialog类

    使用wxWidgets的wxGenericAboutDialog类 wxWidgets是一个开源的C 图形用户界面库 用于跨平台的应用程序开发 它提供了丰富的GUI控件和工具 使开发者能够轻松地创建具有不同操作系统外观的应用程序 其中 wx
  • 利用GeoHash实现逆地理编码(经纬度坐标转换行政区划)

    目录 前言 理解GeoHash GeoHash精度 GeoHash特征 GeoHash规律 逆地理编码 实现逆地理编码的基本思路 1 全国范围内6位精度GeoHash计算 2 获取全国范围内区 县 三级市级别行政区划地址围栏点 3 计算6位
  • 监督学习和无监督学习

    文章目录 监督学习和无监督学习 监督学习算法包括 无监督学习算法包括 OpenCV十个子类 举例 监督学习和无监督学习 监督学习和无监督学习是机器学习领域中两种不同的学习范式 它们之间的区别在于数据的标签或标记的可用性以及学习任务的性质 监
  • Python_Logging日志模块(一)

    一 日志的作用 展现当前程序的活动情况 记录程序的运行轨迹 规范稳定的日志可以帮助开发者迅速定位程序的问题 二 日志的内容 正常情况下 一条完整的日志应该包含调用日志的时间戳 数字形式的日志级别 调用日志的实例化函数的路径 线程名 抛出的活
  • sheel脚本

    sheel脚本 sheel脚本 sheel脚本 sheel脚本的工作方式有两种 交互式和批处理 交互式 用户输入一条就立即执行 批处理 由用户实现编写好一个完整的sheel脚本 sheel会一次执行脚本中诸多命令 脚本中不仅会用到一般的li
  • 测试用例设计方法之等效类,边界值

    概念 等价类划分是一种黑盒测试方法 把无限的测试变成有限的测试 把所有可能的输入数据 即程序的输入域划分成若干等价类 然后从每一个等价类中选取少数具有代表性的数据作为测试用例 依据需求将输入 特殊情况下会考虑输出 划分为若干个等价类 从等价
  • 红帽linux认证有哪些方向

    红帽Linux认证有以下几个方向 RHCSA 红帽认证系统管理员 该认证是红帽认证中的初级认证 主要考察考生对Linux系统管理的掌握程度 包括系统安装 文件系统管理 用户和组管理 网络管理等 RHCE 红帽认证工程师 该认证是红帽认证中的
  • 高德地图定位

    高德地图开放平台 获取key 获取key值后 将其在index html中引入 然后来到App vue下 即根组件下 一进项目就可以获取定位 所以在钩子函数created 中实现定位功能
  • OpenAi 嵌入

    什么是嵌入 OpenAI 的文本嵌入衡量文本字符串的相关性 嵌入通常用于 搜索 结果按与查询字符串的相关性排序 聚类 其中文本字符串按相似性分组 推荐 推荐具有相关文本字符串的项目 异常检测 识别出相关性很小的异常值 多样性测量 分析相似性
  • 2018-2019-2 网络对抗技术 20165322 Exp2 后门原理与实践

    2018 2019 2 网络对抗技术 20165322 Exp2 后门原理与实践 目录 实验准备 后门概念 常用后门工具 实验内容与步骤 使用netcat获取主机操作Shell cron启动 使用socat获取主机操作Shell 任务计划启
  • 阿里带火的中台到底是什么?白话中台战略

    作者 王健 ThoughtWorks首席咨询师 十多年国内外大型企业软件设计开发 团队组织转型经验 一直保持着对技术的热爱 热衷于技术分享 目前专注在企业平台化转型 中台战略规划 微服务架构与实施 大型遗留系统服务化改造 敏捷精益转型 以及
  • IOS工程添加目录

    问题 ios工程和资源工程是分开的 需要将工程外的一个文件夹导入到ios工程中 以前是直接拷贝一份放在frameworks runtime src proj ios mac中 这样操作的缺点就是 修改了公共的资源后 还需要再修改ios工程下
  • 微信小程序的computed的使用

    1 官方参考地址 computed 微信开放文档 qq com 2 自定义组件component和behaviors component参考地址 自定义组件 微信开放文档 qq com behaviors参考地址 behaviors 微信开
  • Solidity中引入的SPDX是什么

    Solidity中引入的SPDX是什么 起因 Solidity 0 6 8 要求引入 SPDX 许可证 否则会出现警告 Warning SPDX license identifier not provided in source file
  • MyBatis万能插入语句

    MyBatis万能插入语句 前言 最近需要做一个动态新增数据的接口 表名 列名 数据都是动态传进来的 需要一个接口就可以把所有表数据新增成功 第一种方式 首先看Mapper dao层 接口 插入数据 param tableName 表名 p
  • linux 解压所有以zip结尾的文件_Linux的压缩/解压缩文件处理 zip & unzip

    Linux的压缩 解压缩命令详解及实例 压缩服务器上当前目录的内容为xxx zip文件 zip r xxx zip 解压zip文件到当前目录 unzip filename zip 另 有些服务器没有安装zip包执行不了zip命令 但基本上都
  • C++中vector的使用

    向量std vector是一种对象实体 能够容纳许多各种类型相同的元素 包括用户自定义的类 因此又被称为序列容器 与string相同 vector同属于STL Standard Template Library 中的一种自定义的数据类型 可