std vector传递指针使用说明

今天用WM_COPYDATA传递一个Vector的指针,传递过来始终失败。后面找到一篇文章,说只要传递第一个元素的地址就行,因为vector在内存是连续的。


static std::vector< UImageContext > VecPatInfo;
VecPatInfo.clear();
			int iSize = worklist.GetWorklistInfo( WorkListDCM_CONNECT_STRUCT, WorkListDCM_CONNECT_STRUCT.m_sModality.GetBuffer(0) );
			for ( int iIndex = 0; iIndex < iSize; iIndex++ )
			{
				const UImageContext &uImageItem = worklist.GetPatientInfo(iIndex);
				VecPatInfo.push_back( uImageItem );
				int iTest1 = sizeof(UImageContext);
				int iTest2 = sizeof(uImageItem);
				iTest1 = 0;
			}
			if (iSize > 0)
			{		
				HWND hwnd = ::FindWindow(NULL, DicomParam.m_sHwndName);  
				if(hwnd)  
				{  
					static COPYDATASTRUCT sendData;  
					sendData.dwData = iSize;//
					sendData.lpData = &VecPatInfo[0];  //&VecPatInfo[0]是指向那个首元素的指针。vector中的元素被C++标准限定为存储在连续内存中,就像是一个数组
					sendData.cbData = sizeof(UImageContext)*iSize;  

					::SendMessage(hwnd, WM_COPYDATA, NULL, (LPARAM)&sendData);  
				}
			}

接收部分

BOOL CMFCDicomApplicationDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
	// TODO: Add your message handler code here and/or call default
	if (pCopyDataStruct == NULL)  
		return 0;
	DWORD dwLength = (DWORD)(pCopyDataStruct->cbData);  
	DWORD iSize = (DWORD)(pCopyDataStruct->dwData); 
	UImageContext *pUImageContext = ( UImageContext *)new UImageContext;
	pUImageContext = ( UImageContext *)(pCopyDataStruct->lpData);
	FILE *file = NULL;
	char szPath[MAX_PATH];memset(szPath,0,sizeof(szPath));
	strcpy_s(szPath,m_strCurPath);
	strcat_s(szPath,"\\WorkListTest.txt");
	fopen_s(&file,szPath,"w+");
	if(file == NULL) 
	{
		return 0;
	}
	for (int i = 0;i<iSize;i++)
	{
		UImageContext uImageItem = pUImageContext[i];	
		CString strWrite;
		strWrite.Format("%s,%s,%s\r\n",uImageItem.strPatientName,uImageItem.strPatientID,uImageItem.strPatientAge);
		fwrite(strWrite.GetBuffer(0),sizeof(char),strWrite.GetLength(),file);		
		
	}
	fclose(file);
	return CDialogEx::OnCopyData(pWnd, pCopyDataStruct);
}

具体分析原因:

std::vector很方便,但有时调用的函数的参数规定是数组,需要将vector转为数组,另外开辟一个空间,将vector一项项复制过去代价过大,可用下面的方法。

给定一个

vector<int>   v;   
      表达式v[0]生产一个指向vector中第一个元素的引用,所以,&v[0]是指向那个首元素的指针。vector中的元素被C++标准限定为存储在连续内存中,就像是一个数组,所以,如果我们想要传递v给这样的C风格的API:   
    
  void   doSomething(const   int*   pInts,   size_t   numInts);   
  我们可以这么做:     
    
  doSomething(&v[0],   v.size());   
  也许吧。可能吧。唯一的问题就是,如果v是空的。如果这样的话,v.size()是0,而&v[0]试图产生一个指向根本就不存在的东西的指针。这不是件好事。其结果未定义。一个较安全的方法是这样:   
    
  if   (!v.empty())   {   
  doSomething(&v[0],   v.size());   
  }   
    
  如果你在一个不好的环境中,你可能会碰到一些半吊子的人物,他们会告诉你说可以用v.begin()代替&v[0],因为(这些讨厌的家伙将会告 诉你)begin返回指向vector内部的迭代器,而对于vector,其迭代器实际上是指针。那经常是正确的,但正如条款50所说,并不总是如此,你 不该依赖于此。begin的返回类型是iterator,而不是一个指针,当你需要一个指向vector内部数据的指针时绝不该使用begin。如果你基 于某些原因决定键入v.begin(),就应该键入&*v.begin(),因为这将会产生和&v[0]相同的指针,这样可以让你有更多 的打字机会,而且让其他要弄懂你代码得人感觉到更晦涩。坦白地说,如果你正在和告诉你使用v.begin()代替&v[0]的人打交道的话,你该 重新考虑一下你的社交圈了。(译注:在VC6中,如果用v.begin()代替&v[0],编译器不会说什么,但在VC7和g++中这么做的话, 就会引发一个编译错误) 



  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值