C++高性能并行编程与优化 - 课件 - 13 C++ STL 容器全解之 vectorvector 容器: resize • 除了可以在构造函数中指定数组的大小,还可以 之后再通过 resize 函数设置大小。 • 这在无法一开始就指定大小的情况下非常方便。 • vectora(4); • 等价于: • vector a; • a.resize(4); • void resize(size_t n); vector 容器: resize • 当然, 当然, resize 也有一个接受第二参数的重载 ,他会用这个参数的值填充所有新建的元素。 • vector a(4, 233); • 等价于: • vector a; • a.resize(4, 233); • void resize(size_t n, int const &val); vector 容器: resize • 调用 resize(n) 的时候,如果数组里面不足 个元素,前 m 个元素会保持不变。 • vector a = {1, 2}; • a.resize(4); • 等价于: • vector a = {1, 2, 0, 0}; • void resize(size_t n); vector 容器: resize • 调用 resize(n) 的时候,如果数组已有超过 n 个元素,假设是 m 个,则他会删除多出来的 m 0 码力 | 90 页 | 4.93 MB | 1 年前3
C++23: An Overview of Almost All New and Updated Featuresstd::generator basic_string(_view)::contains() Construct string(_view) From nullptr basic_string::resize_and_overwrite() Monadic Operations for std::optional Stacktrace Library Changes to Ranges std::generator basic_string(_view)::contains() Construct string(_view) From nullptr basic_string::resize_and_overwrite() Monadic Operations for std::optional Stacktrace Library Changes to Ranges std::generator basic_string(_view)::contains() Construct string(_view) From nullptr basic_string::resize_and_overwrite() Monadic Operations for std::optional Stacktrace Library Changes to Ranges0 码力 | 105 页 | 759.96 KB | 6 月前3
C++高性能并行编程与优化 - 课件 - 15 C++ 系列课:字符与字符串string(“hello”) + string(“world”) == string(“helloworld”) • string 符合 vector 的接口,例如 begin/end/size/resize…… • string 有一系列成员函数,例如 find/replace/substr…… • string 可以通过 s.c_str() 重新转换回古板的 const char * 。 replace(pos, len, str) : • 如果 pos ≥ s.size() 则抛出 out_of_range 异常。 • 如果 pos + len > s.size() 则会扩容字符串 s.resize(pos + len) 。 append 追加一段字符串 • string s = “hello”; • s += “world”; • 最后 s 会得到 “ helloworld” 。 为什么是这样?小彭老师也无从得知,可能是历史原因。 • 猜想是因为 const char * 指针可以自身进行 += 操作来去除开头的 任意部分,所以要让 len 控制尾部的部分;而 string 类型可以自 身进行 resize 操作来去除尾部的任意部分,所以用 len 控制开头 的部分。 • 为了一点点破性能,弄这么多重载,不过这些都已经无所谓了,因 为 C++17 中有更为直观的 string_view ,要切片只需0 码力 | 162 页 | 40.20 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 06 TBB 开启的并行编程之旅com/question/38857029 并行筛选 7 彻底避免了互斥量,完全通过预先准备好的大小,配合 atomic 递增索引批量写入。同时用小彭老师拍脑袋想到的 pod 模板类,使得 vector 的 resize 不会零初始化其中的 值。 加速比: 6.26 倍 并行筛选 8 (不推荐) 而是用 std::vector 作为 parallel_reduce 的元 素类型,通过合并得出最终结果,也是可以的。0 码力 | 116 页 | 15.85 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 02 现代 C++ 入门:RAII 内存管理拷贝构造函数了。 • 这样就可以在编译期提前发现错误: 解决方案:要么定义 • 如果需要允许用户拷贝你的 Vector 类对象 ,我们还是需要实现一下的。 • 发现了吗?其实不管是 size/resize 这样的 get/set 模式也好;自定义的拷贝构造函数 也好; RAII 保证异常安全也好;都是在为 面向对象思想的“封装:不变性”服务。 • 即:保证任何单个操作前后,对象都是处于0 码力 | 96 页 | 16.28 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 08 CUDA 开启的 GPU 编程的 concept 思想所在。因此替换 allocator 实际上是标准库允许的 ,因为他提升了标准库的泛用性。 进一步:避免初始化为 0 • vector 在初始化的时候(或是之后 resize 的时候)会调用所 有元素的无参构造函数,对 int 类型来说就是零初始化。然而 这个初始化会是在 CPU 上做的,因此我们需要禁用他。 • 可以通过给 allocator 添加 construct0 码力 | 142 页 | 13.52 MB | 1 年前3
共 6 条
- 1













