deque与vector同属C++ STL容器,二者有些相似。deque 采用动态数组来管理元素,提供随机存取,它与vector 几乎一摸一样的接口。不同的是:deque的动态数组头尾都开放,能在头尾两端进行快速安插和散出。下面是deque与vector的详细对比:
deque的操作函数
下面是deque的构造函数。
下面是deque的非变动性操作函数。
下面是deque的变动性操作函数:
对deque有一定了解后,就可以用它来做些事情,但是在使用时还需特别注意。下面以一个实例来做说明。下面是一个简单的图像处理的界面。
这里用deque对象来临时存储供操作反悔的图像,eque对象的声明如下:
在画圆操作的代码中,加入如下代码以,存储画圆操作前的图像。
case 3: //draw circle
{
//store image before draw rectangle
if (dst[1].data)
{
if (matContainer.size() >= 5)
matContainer.pop_front();
matContainer.push_back(dst[1]);
iCount = matContainer.size();
}
ReleaseCapture();
iFlag = 0;
bFlag = false;
CBrush br(NULL_BRUSH);
CBrush* oldBrush = pDC->SelectObject(&br);
pDC->SetROP2(R2_NOT);
DrawCircle(pDC, mcpoint[0], mcpoint[1]);
pDC->SelectObject(oldBrush);
int radii = sqrt(pow(mcpoint[1].x - mcpoint[0].x, 2) + pow(mcpoint[1].y - mcpoint[0].y, 2));
circle(dst[1], mpoint[0], radii, Scalar(GetBValue(cCurrentColor), GetGValue(cCurrentColor), GetRValue(cCurrentColor)));
::SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
pDC->SetROP2(R2_COPYPEN);
mString = "“画圆”操作已完成。";
mInformation.SetWindowTextW(mString);
MatToCImage(dst[1], mImage); //send Mat object data to CImage objiect
Invalidate();
}
break;
在“返回”按钮中加入如下测试代码,查看存储的图像是否正确。代码如下:
void CEasyImageDlg::OnBnClickedUndo()
{
switch (iCount)
{
case 1:
imshow("1", matContainer[0]);
waitKey(0);
break;
case 2:
imshow("1", matContainer[0]);
imshow("2", matContainer[1]);
waitKey(0);
break;
case 3:
imshow("1", matContainer[0]);
imshow("2", matContainer[1]);
imshow("3", matContainer[2]);
waitKey(0);
break;
case 4:
imshow("1", matContainer[0]);
imshow("2", matContainer[1]);
imshow("3", matContainer[2]);
imshow("4", matContainer[3]);
waitKey(0);
break;
case 5:
imshow("1", matContainer[0]);
imshow("2", matContainer[1]);
imshow("3", matContainer[2]);
imshow("4", matContainer[3]);
imshow("5", matContainer[4]);
waitKey(0);
break;
}
/*
iCount--;
if (iCount < 0)
{
iCount = 0;
mString = "已返回到最后,没有更多可返回了";
mInformation.SetWindowTextW(mString);
}
dst[1] = matContainer[iCount];
MatToCImage(dst[1], mImage); //send Mat object data to CImage object
Invalidate();
*/
}
试运行程序,界面如下:
点击打开,打开图像
打开图像后如下:
在图像上画5个圆,如下:
点击程序中的“返回”按钮,结果如下:
说明存储的是同一张图像。说明matContainer.push_back(dst[1]);传递的是一个地址,而不是认为应该存储的图像本身。该程序的操作图像是用数组存放的,其声明如下:
dst[0]用于存储源图像,dst[1]用于存储被编辑图像,dst[2]用于交换暂存。
修改代码上面的图像存储代码如下:
试运行,并打开图像,如下:
也画5个圆,如下:
按程序中的“返回”按钮,结果如下:
可以看出存储的图像正确。使用deque也得考虑是否是按值传递,是不是有点晕。