1.命名规则(存在重名进行加_1)
map<CString, int> m_NameCountMap;
CString ThkabcMng::FindDuplicateName(CString strECName)
{
// 检查是否存在重复的外部几何名称
if (m_NameCountMap.find(strECName) != m_NameCountMap.end())
{
// 存在重复,自动添加计数后缀
m_NameCountMap[strECName]++;
int nCount = m_NameCountMap[strECName];
CString strCount;
strCount.Format(_T("%d"), nCount);
strECName = strECName + _T("_") + strCount;
/*m_NameCountMap[strECName] = nCount + 1;*/
}
else
{
// 不存在重复,直接添加到计数表中
m_NameCountMap[strECName] = 0;
}
return strECName;
}
2.递归查找函数(找到最大的数字)
int ThkabcMng::FindMaxId(Thk501ToolAsmComp* pComp)
{
if (pComp == NULL)
{
return -1;
}
int nMaxNodeId = pComp->m_nNodeCode;
for (int i = 0; i < (int)pComp->m_arrComp.GetCount(); i++)
{
ThkabcComp* pAsm = pComp->m_arrComp[i];
if (pAsm == NULL)
{
continue;
}
int nChildMaxNodeId = FindMaxId(pAsm);
if (nChildMaxNodeId > nMaxNodeId)
{
nMaxNodeId = nChildMaxNodeId;
}
}
return nMaxNodeId;
}
3.模糊搜索函数
bool ThkabcMng::FilterSearch(const CString strName, const CString strKey)
{
int strNameIndex = 0; // 当前字符串位置的索引
int keyIndex = 0; // 当前模式位置的索引
int strMatchIndex = 0; // 上一次匹配 "*" 的字符串位置索引
int patternMatchIndex = -1; // 上一次匹配 "*" 的模式位置索引,默认为无效位置
while (strNameIndex < strName.GetLength())
{
if (keyIndex < strKey.GetLength() && (strKey[keyIndex] == strName[strNameIndex] || strKey[keyIndex] == '*'))
{
if (strKey[keyIndex] == '*')
{
patternMatchIndex = keyIndex; // 记录当前 "*" 的模式位置索引
keyIndex++; // 模式位置索引向后移动一位
strMatchIndex = strNameIndex; // 记录当前匹配 "*" 的字符串位置索引
}
else
{
keyIndex++; // 模式位置索引和字符串位置索引都向后移动一位
strNameIndex++;
}
}
else if (patternMatchIndex != std::string::npos)
{
keyIndex = patternMatchIndex + 1; // 模式位置索引回到上一次匹配 "*" 的位置的下一位
strMatchIndex++; // 字符串位置索引向后移动一位
strNameIndex = strMatchIndex; // 字符串位置索引回到上一次匹配 "*" 的位置的下一位
}
else
{
return false; // 如果当前字符不匹配且没有上一次匹配 "*" 的记录,则返回 false
}
}
while (keyIndex < strKey.GetLength() && strKey[keyIndex] == '*')
{
keyIndex++; // 如果模式中剩余的字符都是 "*",则继续向后移动模式位置索引
}
return (keyIndex == strKey.GetLength()); // 如果模式位置索引等于模式长度,说明字符串完全匹配模式,返回 true;否则返回 false
}
4.通过;或者,等等进行分割字符串
#include <afx.h>
#include <iostream>
int main() {
CString inputString = _T("abc_abc_P_*");
CString delimiter = _T("*");
// 找到星号的位置
int pos = inputString.Find(delimiter);
if (pos != -1) {
// 提取星号之前的子串
CString prefix = inputString.Left(pos);
std::wcout << _T("前缀: ") << prefix.GetString() << std::endl;
// 提取星号之后的子串
CString suffix = inputString.Mid(pos + delimiter.GetLength());
std::wcout << _T("后缀: ") << suffix.GetString() << std::endl;
} else {
std::wcout << _T("未找到星号") << std::endl;
}
return 0;
}