首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++ vector 使用详解(含C++20新特性)

介绍两个关键词  (1) constexpr 是 C++11 中新增的关键字,其语义是 "常量表达式",也就是在编译期可求值的表达式。...最基础的常量表达式就是字面值或全局变量/函数的地址或 sizeof 等关键字返回的结果,而其它常量表达式都是由基础表达式通过各种确定的运算得到的。...constexpr 修饰的变量一定是编译期可求值的,修饰的函数在其所有参数都是 constexpr 时,一定会返回 constexpr。 ...它对应于 non-reversed 的最后一个元素 vector。如果向量为空,则返回的迭代器等于 rend()。 ...() 将给定元素添加到容器末尾  void push_back( const T& value );   (1) void push_back( T&& value );        (2)   (1

1.7K30

技术◈C++核心知识总结(I)

有的朋友可能觉得我飘了,竟然敢写C++(作为一门高冷的语言,就是叼)!。。。没错,我就是飘了!我就敢写!...->push_back(batch_id); } 世界又清净了一些!...常量限定符const与 constexpr 讲完了自动类型推导,接下来说一下C++中与常量定义相关的两个关键词 const 和 constexpr。...constexpr作为限定词在含义上与const并不相同,constexpr是为了在初始化一个变量时,让编译器判断这个变量的值是否是一个常量常量表达式,如果该变量用constexpr限定,但是初始化值并不是一个常量或者常量表达式...,编译器便会报错,(因为我们在定义常量时并不确定右边的表达式是否是常量表达式),这样看来还是难于解释,下面就用几个例子解释一下: constexpr int a = k +1; constexpr int

74230
您找到你想要的搜索结果了吗?
是的
没有找到

C++の自动类型推导和其他

->push_back(batch_id); } 世界又清净了一些!...常量限定符const与 constexpr 讲完了自动类型推导,接下来说一下C++中与常量定义相关的两个关键词 const 和 constexpr。...如下: int k = j; 可能有的朋友会有些疑惑,既然表达式 int &k = j; 是错误,为什么去掉&就可以了呢?简单解释一下,其实引用并不是一个实体对象,而是代表了一种绑定关系。...constexpr作为限定词在含义上与const并不相同,constexpr是为了在初始化一个变量时,让编译器判断这个变量的值是否是一个常量常量表达式,如果该变量用constexpr限定,但是初始化值并不是一个常量或者常量表达式...,编译器便会报错,(因为我们在定义常量时并不确定右边的表达式是否是常量表达式),这样看来还是难于解释,下面就用几个例子解释一下: constexpr int a = k +1; constexpr int

63410

现代C++之constexpr

因此,const变量既可以定义编译时常量(比如size1)来指定数组大小,也可以定义运行时常量(比如size2)来定义数组大小。另一方面,constexpr总是定义可以指定数组大小的编译时常量。...顺便说一下,这些constexpr函数是常规C ++函数,即使传递了非常量参数也可以调用它们。但是在这种情况下,您将获得非constexpr值。...5.补充 内联变量C++17 引入了内联(inline)变量的概念,允许在头文件中定义内联变量,然后像内联函数一样,只要所有的定义都相同,那变量的定义出现多次也没有关系。...> struct magic { static const int number = 42; }; int main() { std::vector v; // 调用 push_back...前者可行的原因是,类的静态 constexpr 成员变量默认就是内联的。const 常量和类外面的 constexpr 变量不默认内联,需要手工加 inline 关键字才会变成内联。

1.2K20

C++模板元编程:利用编译时计算和泛型编程

return 0;}通过使用模板元编程,我们可以在编译时计算出斐波那契数列的值,并将结果作为常量存储在编译阶段。...该方法接受一个std::vector类型的参数,并返回一个排序后的新向量。 在排序方法中,我们选择第一个元素作为基准,将待排序的序列分成小于、等于和大于基准值的三部分。...在main函数中,我们创建一个整数型的向量,并使用QuickSort::sort方法对其进行排序。最后将排序前和排序后的向量打印出来。...由于这个计算是在编译时进行的,所以可以通过constexpr关键字将结果存储在result常量中,并在运行时输出结果。在编译时进行计算可以提高性能和效率,并且可以避免在运行时进行重复的计算。...这个示例展示了如何使用C++模板元编程的特性来进行编译时计算。通过使用模板的递归和特化,我们可以在编译期间生成递归展开的代码,从而实现高效的斐波那契数列计算。

26800

C++ STL 详解

容器 特性 所在头文件 向量vector 可以用常数时间访问和修改任意元素,在序列尾部进行插入和删除时,具有常数时间复杂度,对任意项的插入和删除就有的时间复杂度与到末尾的距离成正比,尤其对向量头的添加和删除的代价是惊人的高的... 双端队列deque 基本上与向量相同,唯一的不同是,其在序列头部插入和删除操作也具有常量时间复杂度 表list 对任意元素的访问与对两端的距离成正比,但对某个位置上插入和删除一个项的花费为常数时间...,而在C++里,有个新奇的东西叫做迭代器iterator,我们可以使用它来访问容器元素。...<< endl; } vector C++ STL中的verctor好比是C语言中的数组,但是vector又具有数组没有的一些高级功能。.../默认初始化为空字符串 如何vector添加元素?

1K40

Modern c++快速浅析

异常中立函数永远不具备noexcept的性质•noexcept性质对于移动操作,swap,内存释放函数和析构函数最有价值 C++11的noexcept标识符与操作符应如何正确使用?...constexpr constexpr代表编译期常量,它所标识的值可能被放入到只读内存段中,如数组,非类型模板参数,枚举类型等要求的都是编译期常量,const代表运行期常量。...所有constexpr对象都是const对象,但并非所有的const对象都是constexpr对象 // 都要求编译期常量 int arr[10]; std::array arr; constexpr...,那么代表构造出来的对象可以是一个编译期常量 以修饰函数为例,函数是否的返回值是否满足constexpr取决于两个方面 •传入的参数是否是编译期常量•函数体内的计算是否是编译期能够处理的 当两者条件都能满足时...访问得到不确定的值 callBack(); } 常见的解决方法是使用值捕获,或者使用捕获指向堆上的指针来自行管理对象的生命周期(或者使用智能指针,注意std::shared_ptr按引用捕获的时候

14210

C++常见避坑指南

; 迭代器删除 在处理缓存时,容器元素的增删查改是很常见的,通过迭代器去删除容器(vector/map/set/unordered_map/list)元素也是常有的,但这其中使用不当也会存在很多坑。...px = &x; // 常量指针 给变量加上const之后就成了“常量”,只能读、不能修改,编译器会检查出所有对它的修改操作,发出警告,在编译阶段防止有意或者无意的修改。...总之,const默认与其左边结合,当左边没有任何东西则与右边结合。...const 并未区分出编译期常量和运行期常量,并且const只保证了运行时不直接被修改,而constexpr是限定在了编译期常量。...简而言之,所有constexpr对象都是const对象,而并非所有的const对象都是constexpr对象。

28110

重温C++的设计思想

三、容器 3.1 连续内存的vector容器 vector保证强异常安全性,如果元素类型没有提供一个保证不抛异常的移动构造函数,vector使用拷贝构造函数。...如果自定义类型拷贝构造代价较高,则使用移动构造函数,并标其为noexcept,或者只在容器中放置对象的智能指针。 C++11提供的emplace系列函数,是为了提升容器性能设计。...emplace_back比push_back 少额外生成临时对象,少一次拷贝构造和一次析构。 现代处理器架构对连续内存访问速度比不连续内存访问速度快很多,所以vector的连续内存是他的优点。...3.5 容器共性 容器的共性:容器类都有begin()和end()函数,大部分容器拥有sizie(),push_back()。不必集成一个共同的容器积累,便可以拥有通用地遍历一个容器的方法。...六、其他 constexpr和const是编译期常量和运行期常量的意思 lambda表达式:以一对中括号开始,不需要说明返回值(类似auto)

1.6K247

C++11移动语义与右值引用

其中,第一次拷贝构造是vector的特性决定的,不可避免。但第二次拷贝构造,在C++ 11中就是可以避免的了。...它是如何实现这一过程的呢?...可以将一个const的引用绑定到一个右值上 int&& rr2=i*42; //正确:将rr2绑定到乘法结果上 从上面可以看到左值与右值的区别有: (1)左值一般是可寻址的变量,右值一般是不可寻址的字面常量或者是在表达式求值过程中创建的可寻址的无名临时对象...这两个特性意味着,使用右值引用的代码可以自由地接管引用的对象的资源。关于无名临时对象,请参见认识C++中的临时对象temporary object。...简单总结为: (1)所有右值引用折叠到右值引用上仍然是一个右值引用; (2)所有的其他引用类型之间的折叠都将变成左值引用。

1K20

浅谈 C++ 元编程

除了模板,现代 C++ 还允许使用 constexpr 函数进行常量计算。由于 constexpr 函数功能有限,所以目前的元编程程序主要基于模板。...2.1.1 测试表达式 类似于 静态断言 (static assert),编译时测试的对象是 常量表达式 (constexpr),即编译时能得出结果的表达式。...以不同的常量表达式作为参数,可以构造各种需要的模板重载。例如,代码演示了如何构造 谓词 (predicate) isZero,编译时判断 Val 是不是 0。...例如,在 std::vector 的实现中,对 T * 和 void * 进行了特化;然后将所有的 T * 的实现 继承 到 void * 的实现上,并在公开的函数里通过强制类型转换,进行 void *... 和 T * 的相互转换;最后这使得所有的指针的 std::vector 就可以共享同一份实现,从而避免了代码膨胀。

2.8K60

【Modern C++】深入理解移动语义

从上述描述,我们可以理解为std::move()并没有移动任何东西,它只是进行类型转换而已,真正进行资源转移的是开发人员实现的移动操作。...标准库中很多容器都支持移动语义,以std::vector为例,**vector::push_back()**定义了两个重载版本,一个像以前一样将const T&用于左值参数,另一个将T&&类型的参数用于右值参数...push_back(T&&)使用BigObj的移动构造函数将资源从参数移动到vector的内部BigObj对象中。而在C++11之前,上述代码则生成参数的拷贝,然后调用BigObj的拷贝构造函数。...如果参数是左值,则将调用push_back(T&): int main() { std::vector v; BigObj obj(10); v.push_back(obj)...: int main() { std::vector v; BigObj obj(10); v.push_back(std::move(obj)); // 此处调用push_back

75410

C++(STL):07---vector之使用方式和常规用法

但是无论如何,重新分配都应该是对数增长的间隔大小,以至于在末尾插入一个元素的时候是在常数时间的复杂度完成的。...vector声明及初始化 vector vec; //声明一个int型向量 vector vec(5); //声明一个初始大小为5的int向量 vector vec(10..., 1); //声明一个初始大小为10且值都是1的向量 vector vec(tmp); //声明并用tmp向量初始化vec向量 vector tmp(vec.begin(), vec.begin...:vec.swap(); 清空向量元素:vec.clear(); (3)迭代器 开始指针:vec.begin(); 末尾指针:vec.end(); //指向最后一个元素的下一个位置 指向常量的开始指针:...所以,对于空的 vector 容器来说,可以通过调用 push_back() 或者借助 resize() 成员函数实现初始化容器的目的。

75520

现代C++之万能引用、完美转发、引用折叠(万字长文)

2.引入万能引用 这个问题的本质实际上是,类型声明当中的“&&”有的时候意味着rvalue reference,但有的时候意味着rvalue reference 或者 lvalue reference。...如果我们看看push_back在类外部是如何声明的,这个问题的答案就很清楚了。我会假装std::vector的 Allocator 参数不存在,因为它和我们的讨论无关。...我们来看看没Allocator参数的std::vector::push_back: template void vector::push_back(T&& x); push_back...但如果我们有了一个叫做std::vector的类,我们就已经知道了T是什么东西,那就没必要推导T。 举个例子可能会更好。...这个push_back 的声明看起来像这样: void std::vector::push_back(Widget&& x); 看到了没?

6K21

【笔记】《C++Primer》—— 第3章

第三章是讲字符串,向量和数组等容器及其遍历。其中字符串和向量都是C++的STL的类,用好的话会比结尾的数组方便很多。...3.3 字符串有string来替代,相似的,C++创造了vector(向量)来替代C风格的数组。这个替代相对来说没有那么必要,但是还是很有用。...vector的内容必须是对象,不可以是引用这种没有实体的东西vector自然也可以是另一个嵌套的vector,也就是可以做到类似多维数组的效果。...和数组有一点理念上的不同:vector并不需要提前决定大小,vector提供了往末尾增加元素的push_back()函数,效率非常高,相比之下初始指定大小只有在选择初始化为同一个值时才有优势。...(也就是不要初始化大小后再用循环来逐个赋值,而是要选择不断的push_back)。 vector自然也有类似于string的各种操作,不表。

90220

const成员函数一定是线程安全的吗?

//情况1:constexpr对象具备const属性,并且是在编译阶段已知 //编译阶段已知的常量值可以用在 C++ 要求整型常量表达式的语境中,这些语境包括数组的尺寸规格,整型 //模板实参(std:...arraySize22的值非编译期可知 //总结:所有 constexpr对象都是const对象,而并非所有的const对象都是 constexpr对象。...//情况3:constexpr修饰的函数包含两大类 /** 1, 要求编译期常量的语境中:如你传给一个 constexpr函数的实参值是在编译器已知的,则结果也会在编译期间计算出,如果任何一个实参值在编译期未知...*/ //pow是个 constexpr函数,且不会抛出异常 //constexpr并不是表面 pow要返回一个const值,它表明的是如果 base和exp是编译期的常量,pow的返回结果就可以当一个编译期常量使用...//宗旨:多个线程同时调用带有 const 得成员函数,如何保证线程的安全性 //const成员函数就一定是线程安全的吗?

1K20
领券