emplace_back 例程
时间: 2023-10-14 08:08:10 浏览: 70
emplace_back是一个模板函数,用于在容器的末尾插入一个元素。它的语法是:
```c++
template <class... Args>
void emplace_back(Args&&... args);
```
它可以接受任意数量的参数,这些参数会被转发给元素类型的构造函数进行构造。相比于调用push_back函数,使用emplace_back可以减少元素类型的构造和析构次数,从而提高程序的性能。
相关问题
emplace_back例程
emplace_back() 是 C++ STL 中 vector 容器的一个成员函数,用于在 vector 的末尾添加一个元素,而不是像 push_back() 那样先创建一个元素,再将其插入到容器中。emplace_back() 函数直接在 vector 的内存空间中构造一个元素,效率更高。下面是一个 emplace_back() 的例程:
```c++
#include <iostream>
#include <vector>
class MyClass {
public:
MyClass(int x, int y): x_(x), y_(y) {}
void print() const {
std::cout << "x = " << x_ << ", y = " << y_ << std::endl;
}
private:
int x_;
int y_;
};
int main() {
std::vector<MyClass> vec;
// 添加元素
vec.emplace_back(1, 2);
vec.emplace_back(3, 4);
vec.emplace_back(5, 6);
// 输出元素
for (const auto& elem : vec) {
elem.print();
}
return 0;
}
```
上述例程中,我们定义了一个包含两个整型成员变量的 MyClass 类。然后,我们创建了一个 vector 容器,用于存储 MyClass 类型的对象。接下来,我们使用 emplace_back() 函数向 vector 中添加了三个 MyClass 类型的对象。最后,我们使用 for 循环遍历 vector 容器中的元素,并调用 MyClass 类的 print() 函数输出每个元素的值。
使用多线程并行计算来加速warpAffine并带参数WARP_INVERSE_MAP C++例程
以下是一个使用多线程并行计算来加速warpAffine并带参数WARP_INVERSE_MAP的C++例程:
```cpp
#include <opencv2/opencv.hpp>
#include <thread>
using namespace cv;
void warpAffineParallel(const Mat& src, Mat& dst, const Mat& M, int flags, int start_row, int end_row) {
Mat dst_row = dst.rowRange(start_row, end_row);
warpAffine(src, dst_row, M, dst_row.size(), flags | WARP_INVERSE_MAP);
}
void warpAffineParallelWrapper(const Mat& src, Mat& dst, const Mat& M, int flags, int num_threads) {
int rows_per_thread = dst.rows / num_threads;
std::vector<std::thread> threads;
for (int i = 0; i < num_threads - 1; ++i) {
threads.emplace_back(warpAffineParallel, std::ref(src), std::ref(dst), std::ref(M), flags, i * rows_per_thread, (i + 1) * rows_per_thread);
}
threads.emplace_back(warpAffineParallel, std::ref(src), std::ref(dst), std::ref(M), flags, (num_threads - 1) * rows_per_thread, dst.rows);
for (auto& thread : threads) {
thread.join();
}
}
int main() {
Mat src = imread("input.jpg");
Mat M = getRotationMatrix2D(Point(src.cols / 2, src.rows / 2), 30, 1);
Mat dst(src.size(), src.type());
int num_threads = std::thread::hardware_concurrency();
warpAffineParallelWrapper(src, dst, M, INTER_LINEAR, num_threads);
imshow("input", src);
imshow("output", dst);
waitKey(0);
return 0;
}
```
该代码使用`warpAffineParallelWrapper`函数来将图像分成若干个块,然后使用多个线程并行计算warpAffine。`warpAffineParallel`函数是一个单独的线程函数,它接收源图像、目标图像、变换矩阵、标志以及当前处理的行范围。在`warpAffineParallelWrapper`函数中,我们使用`std::thread::hardware_concurrency()`获取系统的线程数,并将每个线程分配给每个块。最后,我们等待所有线程完成,然后显示输出图像。
请注意,该代码仅用于演示多线程并行计算如何加速warpAffine,并带参数WARP_INVERSE_MAP,实际上并不适合在所有情况下使用。在某些情况下,使用多线程可能会降低性能,因为线程管理和调度开销可能会超过并行计算的好处。在实际应用中,您需要根据具体情况进行测试和优化。
阅读全文