首页
学习
活动
专区
工具
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

2.1K30

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

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

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

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

    76030

    现代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++终极篇】C++11:编程新纪元的神秘力量揭秘

    对于像string/vector这样的深拷⻉的类或者包含深拷⻉的成员变量的类,移动构造和移动赋值才有 意义,因为移动构造和移动赋值的第⼀个参数都是右值引⽤的类型,他的本质是要“窃取”引⽤的 右值对象的资源...: ①constexpr(constant expression):只能修饰常量表达式,且这个常量表达式只能用常量初始化不能用变量。...= c; // d不是常量表达式 const int e = size(); // e不是常量表达式 ②当然constexpr可以修改变量,constexpr修饰的变量⼀定是常量表达式, 且必须⽤...(也就是说constexpr只是起到修饰作用,被修饰的量如何进行还要看它本身的性质)如: constexpr const int* p3 = &d; //constexpr修饰的是p3本⾝,const修饰...返回值不是常量表达式 constexpr int N5 = fxx(10); // 报错 ,返回值是常量表达式,但函数体内运行时还执行了其他操作 } ⑤constexpr不能修饰⾃定义类型的对象,但是

    2900

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

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

    59400

    C++ STL 详解

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

    1.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按引用捕获的时候

    20410

    C++常见避坑指南

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

    55210

    重温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)所有的其他引用类型之间的折叠都将变成左值引用。

    1.1K20

    【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

    87710

    浅谈 C++ 元编程

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

    3.1K61

    C++奇迹之旅:vector使用方法以及操作技巧

    () 常用操作符 push_back pop_back find insert erase 总结 前言 本节我们将学习vector容器的使用和操作,让我们学习起来吧!...库可以实施不同的增长策略,以平衡内存使用和重新分配之间的平衡,但无论如何,重新分配应该只在大小的对数增长间隔下发生,以便在向量末尾插入单个元素时可以提供摊销的恒定时间复杂度(参见push_back)。...vector (const vector& x); 这个构造函数使用另一个 std::vector x 的内容创建一个新的 std::vector,它会复制 x 中所有的元素,并且新创建的 std::...const_numbers[2]: " << const_numbers[2] << std::endl; // 输出:300 // const_numbers[2] = 350; // 错误:不能修改常量向量...在这种情况下,可以考虑使用更高效的算法,如 std::binary_search 或者基于哈希表的查找。

    8900

    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() 成员函数实现初始化容器的目的。

    80720

    【笔记】《C++Primer》—— 第一部分:C++基础

    ,会被auto忽视 只想推导数据类型而不需要赋值,可以使用decltype关键字 如果表达式是decltype((x)),则返回的类型永远是引用,而没有双层括号时才是按照x本身状态来判断 3 字符串,向量和数组...提供了往末尾增加元素的push_back()函数,效率非常高 和matlab中的矩阵不同,vector不能给不存在的元素赋值 迭代器(iterator)的操作思路是和C的指针一致的,但是又要比指针安全方便很多...C++的异常类在标准库中有定义,分别在stdexcept,exception,new,type_inifo四个头文件中,每个异常我们使用它们都有的what函数来得到异常的信息,详细回到5.6可以查看 6...这是由于argv的第一个元素固定为程序调用时所输入的程序名,最后一个元素固定为0 有几种方法来传入可变数量的实参:一种是当数量未知而类型固定时,使用C11标准库的initializer_list来作为形参...,至少含有一个constexpr构造函数,成员若有类内初始值则必由字面值常量或其自己的constexpr构造且类必须使用默认的析构函数的类,称为字面值常量类 static关键字只出现在类的声明里,不能在外部重复这个关键字

    1.5K40
    领券