emplace_back 和 push_back 是 C++ 中 std::vector用于添加元素的两个成员函数。
区别:
push_back:接受一个已构造好的对象(通过拷贝或移动),将其添加到容器末尾。
emplace_back:直接在容器内部构造对象,避免额外的拷贝或移动操作。
#pragma once
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/calib3d/calib3d.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
#include <fstream>
#include <vector>
using namespace cv;
using namespace std;
int main()
{
vector <cv::Point> rectpoint;
vector <cv::Point> rect;
// 1.emplace_back写入数据:
for (int i = 0; i < 9; i++)
{
if (i == 0)
{
rectpoint.emplace_back(1, 2);
}
if (i == 2)
{
rectpoint.emplace_back(3, 4);
}
if (i == 6)
{
rectpoint.emplace_back(5, 6);
}
if (i == 8)
{
rectpoint.emplace_back(7, 8);
}
}
// 2.push_back写入数据:
for (int i = 0; i < 9; i++)
{
if (i == 0)
{
// 方法1:push_back
cv::Point p(1, 2);
rect.push_back(p);
// 方法2:rect.push_back(cv::Point(1, 2));
}
if (i == 2)
{
rect.push_back(cv::Point(3, 4));
}
if (i == 6)
{
rect.push_back(cv::Point(5, 6));
}
if (i == 8)
{
rect.push_back(cv::Point(7, 8));
}
}
// 3.打印数据rectpoint:
for (int i = 0; i < 4; i++)
{
cout << "rectpoint[i].x=" << rectpoint[i].x << ",rectpoint[i].y=" << rectpoint[i].y << endl; ;
}
// 4.打印数据rect:
for (int i = 0; i < 4; i++)
{
cout << "rect[i].x=" << rect[i].x << ",rect[i].y=" << rect[i].y << endl; ;
}
// 5.修改-打印数据:
rect[0].x = 313.760223;
rect[0].y = 110.513077;
rect[1].x = 422.942902;
rect[1].y = 112.106293;
printf("1.rect_point_dilate=%f rect_point_dilate=%f\n",
int(rect[0].x), int(rect[0].y));
printf("2.rect_point_dilate=%d rect_point_dilate=%d\n",
int(rect[0].x), int(rect[0].y));
return 0;
}
打印结果:
rectpoint[i].x=1,rectpoint[i].y=2
rectpoint[i].x=3,rectpoint[i].y=4
rectpoint[i].x=5,rectpoint[i].y=6
rectpoint[i].x=7,rectpoint[i].y=8
rect[i].x=1,rect[i].y=2
rect[i].x=3,rect[i].y=4
rect[i].x=5,rect[i].y=6
rect[i].x=7,rect[i].y=8
1.rect_point_dilate=0.000000 rect_point_dilate=0.000000
2.rect_point_dilate=313 rect_point_dilate=110