我用ATL的确ICollectionOnSTLImpl 定义了一个集合,存放一个对象类,并对这个集合进行了插入、删除及其检索的操作。
    但是我对这个集合进行访问时(运用如下迭代访问):// IGraphPage :是我定义的一个接口typedef list<CAdapt< CComPtr<IGraphPage> > > CPageList;
CPageList::iterator it;
CComPtr<IGraphPage> spPage = 0;
for(it = m_coll.begin(); it != m_coll.end(); it++)
{
spPage = *it;
ATLASSERT(spPage != NULL);
         ...}
访问集合中元素同初始实际插入的顺序不一样,而且它们的顺序也是确定的,我要如何使它们是一个有序的呀!//
我把这个集合存入在一个复合文件中,并运用了复合文件的读取方式读取这个集合。STDMETHODIMP CGraphPages::Save(LPSTORAGE pStg, BOOL bSameAsLoad)
{
HRESULT hr = E_FAIL;
if (NULL == pStg) return S_FALSE;

//Create sub storage for every page.
CComPtr<IStorage> spSubStg = NULL;
CComPtr<IGraphPage> spPage = NULL;
CComBSTR bstrPageID = NULL;
CComBSTR bstrName = NULL; 
CComQIPtr< IGraphShape> spPShape;
CPageList::iterator it;
for (it = m_coll.begin(); it != m_coll.end(); ++it)
{
spPage = NULL;
spSubStg = NULL;
spPage = *it;
spPage->get_PageID(&bstrPageID);
spPShape = spPage ;
spPShape->get_Name( &bstrName );
USES_CONVERSION;
ATLTRACE( "Page ID: %s\n", OLE2T(bstrPageID) );
ATLTRACE( "Page Name: %s\n", OLE2T( bstrName ) );
hr = pStg->CreateStorage(bstrPageID,
STGM_CREATE | STGM_READWRITE | STGM_SHARE_EXCLUSIVE,
0, 0, &spSubStg);
if (FAILED(hr)) break;
CComPtr<IPersistStorage> spPersistStg = NULL;
hr = spPage->QueryInterface(IID_IPersistStorage, (void**)&spPersistStg);
if (FAILED(hr)) break;
hr = spPersistStg->Save(spSubStg, FALSE);
if (FAILED(hr)) break;
}
return hr;
}