[英]Why I can't call std::mismatch function for the second time?
I use STL's mismatch function to help me to find common directory path. 我使用STL的不匹配功能来帮助我查找公用目录路径。 In doing so, I use multimap::equal_range to get range of equal elements.
为此,我使用multimap :: equal_range获取相等元素的范围。
For my sample program (please see fro you reference), I got a vector vPathWithCommonDir filled with 3 elements such as "C:/MyProg/Raw/", "C:/MyProg/Subset/MTSAT/" and "C:/MyProg/Subset/GOESW/", when iterating the multimap mmClassifiedPaths for the first time. 对于我的示例程序(请参阅),我得到了一个向量vPathWithCommonDir,其中填充了3个元素,例如“ C:/ MyProg / Raw /”,“ C:/ MyProg / Subset / MTSAT /”和“ C:/ MyProg / Subset / GOESW /”,则在首次迭代多图mmClassifiedPaths时。 I then passed this vector to FindCommonPath function, and returned a common path "C:/MyProg" what I wanted.
然后,我将此向量传递给FindCommonPath函数,并返回所需的公共路径“ C:/ MyProg”。 When looping for the second time, it's not necessary to call FindCommonPath function because there is only one element.
第二次循环时,由于只有一个元素,因此不必调用FindCommonPath函数。 When iterating for the third time, I got a vector vPathWithCommonDir filled with 2 elements, namely "D:/Dataset/Composite/" and "D:/Dataset/Global/".
当第三次迭代时,我得到一个向量vPathWithCommonDir,其中填充了2个元素,即“ D:/ Dataset / Composite /”和“ D:/ Dataset / Global /”。 A fatal error occurred when I called FindCommonPath function passed with vPathWithCommonDir for the second time.
当我第二次调用通过vPathWithCommonDir传递的FindCommonPath函数时,发生了致命错误。 I could not solve this problem.
我无法解决这个问题。
Would you please help me? 你能帮我吗? Thank you very much!
非常感谢你!
// TestMismatch.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <algorithm>
#include <map>
#include <vector>
#include <string>
std::string FindCommonPath(const std::vector<std::string> & vDirList, char cSeparator) ;
int _tmain(int argc, _TCHAR* argv[])
{
std::vector<std::string> vDirList;
// Populate the vector list
vDirList.push_back("C:/XML/");
vDirList.push_back("C:/MyProg/Raw/");
vDirList.push_back("C:/MyProg/Subset/MTSAT/");
vDirList.push_back("C:/MyProg/Subset/GOESW/");
vDirList.push_back("D:/Dataset/Composite/");
vDirList.push_back("D:/Dataset/Global/");
vDirList.push_back("E:/Dataset/Mosaic/");
std::multimap<std::string, std::string> mmClassifiedPaths;
for (std::vector<std::string>::iterator it = vDirList.begin(); it != vDirList.end(); it++)
{
std::string sPath = *it;
std::string::iterator itPos;
std::string::iterator itBegin = sPath.begin();
std::string::iterator itEnd = sPath.end();
// Find the first occurrence of separator '/'
itPos = std::find( itBegin, itEnd, '/' );
// If found '/' for the first time
if ( itPos != itEnd )
{
// Advance the current position iterator by at least 1
std::advance(itPos, 1);
// Find the second occurrence of separator '/'
itPos = std::find( itPos, itEnd, '/' );
// If found '/' for the second time
if ( itPos != itEnd )
{
std::string sFound = sPath.substr(0, itPos - itBegin);
mmClassifiedPaths.insert( std::pair<std::string, std::string>(sFound, sPath) );
}
}
}
//std::multimap<std::string, std::string>::iterator it;
std::vector<std::string> vPathToWatch;
std::pair<std::multimap<std::string, std::string>::iterator, std::multimap<std::string, std::string>::iterator> pRet;
for (std::multimap<std::string, std::string>::iterator it = mmClassifiedPaths.begin();
it != mmClassifiedPaths.end(); it++)
{
size_t nCounter = (int)mmClassifiedPaths.count(it->first);
pRet = mmClassifiedPaths.equal_range(it->first);
if (nCounter <= 1)
{
vPathToWatch.push_back(it->second);
continue;
}
std::vector<std::string> vPathWithCommonDir;
for (std::multimap<std::string, std::string>::iterator itRange = pRet.first; itRange != pRet.second; ++itRange)
{
vPathWithCommonDir.push_back(itRange->second);
}
// Find the most common path among the passed path(s)
std::string strMostCommonPath = FindCommonPath(vPathWithCommonDir, '/');
// Add to directory list to be watched
vPathToWatch.push_back(strMostCommonPath);
// Advance the current iterator by the amount of elements in the
// container with a key value equivalent to it->first
std::advance(it, nCounter - 1);
}
return 0;
}
std::string FindCommonPath(const std::vector<std::string> & vDirList, char cSeparator)
{
std::vector<std::string>::const_iterator vsi = vDirList.begin();
int nMaxCharsCommon = vsi->length();
std::string sStringToCompare = *vsi;
for (vsi = vDirList.begin() + 1; vsi != vDirList.end(); vsi++)
{
std::pair<std::string::const_iterator, std::string::const_iterator> p = std::mismatch(sStringToCompare.begin(), sStringToCompare.end(), vsi->begin());
if ((p.first - sStringToCompare.begin()) < nMaxCharsCommon)
nMaxCharsCommon = p.first - sStringToCompare.begin();
}
std::string::size_type found = sStringToCompare.rfind(cSeparator, nMaxCharsCommon);
return sStringToCompare.substr( 0 , found ) ;
}
You have to ensure that there are at least as many items in both iterator ranges provided to mismatch
- it does not do any checking. 您必须确保在两个迭代器范围内提供的项目数至少
mismatch
-它不会进行任何检查。
The fix would be to do a distance check between the ranges and provide the smaller one as the first range and the larger range as second. 解决方法是在范围之间进行距离检查,并提供较小的范围作为第一个范围,较大的范围作为第二个范围。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.