首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >得到"Debug Assertion Failed!“用于设置比较器

得到"Debug Assertion Failed!“用于设置比较器
EN

Stack Overflow用户
提问于 2011-04-29 02:44:49
回答 3查看 2.1K关注 0票数 8

我知道在这个链接Help me fix this C++ std::set comparator上已经回答了类似的问题,但不幸的是,我面临着完全相同的问题,我无法理解它背后的原因,因此需要一些帮助来解决它。

我使用的是VS2010,我的发布二进制文件运行良好,没有任何问题,但调试二进制文件报告:

我的比较器如下所示:

代码语言:javascript
复制
struct PathComp {
    bool operator() (const wchar_t* path1, const wchar_t* path2) const
    {
        int c = wcscmp(path1, path2);
        if (c < 0 || c > 0) {
            return true;
        }
        return false;
    }
};

我的set声明如下:

代码语言:javascript
复制
set<wchar_t*,PathComp> pathSet;

有人能告诉我为什么我的调试二进制文件在这个断言中失败了吗?是因为我使用wcscmp()函数来比较存储在我的集合中的宽字符串吗?

提前感谢!

EN

回答 3

Stack Overflow用户

发布于 2011-05-05 00:25:49

std::set需要一个行为类似于operator<std::less的有效计算器。

set代码检测到您的operator<无效,并帮助您触发了所显示的断言。

事实上:你的电脑看起来像operator!=,而不像operator<

operator<应该遵循的规则之一是a<bb<a不能同时为真。在您的实现中,它是这样的。

将您的代码更正为:

代码语言:javascript
复制
bool operator() (const wchar_t* path1, const wchar_t* path2) const
{  
  int c = wcscmp(path1, path2);
  return (c < 0);
}

你应该会好起来的。

票数 18
EN

Stack Overflow用户

发布于 2011-05-05 00:25:38

问题是,您的比较器不会导致严格-弱排序。它应该只对“较少”的路径返回true,而不是所有不同的路径。将其更改为:

代码语言:javascript
复制
struct PathComp {
    bool operator() (const wchar_t* path1, const wchar_t* path2) const
    {
        int c = wcscmp(path1, path2);
        if (c < 0) {  // <- this is different
            return true;
        }
        return false;
    }
};

或者,只使用c > 0也可以--但是集合的顺序是相反的。

算法需要知道较小和较大之间的差异才能工作,只是不相等并不能提供足够的信息。如果没有小于/大于信息,集合就不可能保持顺序-但这就是集合的全部内容。

票数 9
EN

Stack Overflow用户

发布于 2011-05-04 18:04:34

在花了更多的时间之后,我们最终决定采取另一种方法,这对我来说是有效的。

因此,我们使用以下方法将wchar_t*转换为字符串:

代码语言:javascript
复制
// Converts LPWSTR to string
bool convertLPWSTRToString(string& str, const LPWSTR wStr)
{
    bool b = false;
    char* p = 0;
    int bSize;    
    // get the required buffer size in bytes
    bSize = WideCharToMultiByte(CP_UTF8,
        0,
        wStr,-1,
        0,0,
        NULL,NULL);     
    if (bSize > 0) {
        p = new char[bSize];
        int rc = WideCharToMultiByte(CP_UTF8,
            0,
            wStr,-1,
            p,bSize,
            NULL,NULL);
        if (rc != 0) {
            p[bSize-1] = '\0';
            str = p;
            b = true;
        }
    }
    delete [] p;
    return b;
}

然后将该字符串存储在集合中,这样我就不必担心比较存储的元素,以确保所有条目都是唯一的。

代码语言:javascript
复制
// set that will hold unique path
set<string> strSet;

所以我要做的就是:

代码语言:javascript
复制
string str;
convertLPWSTRToString(str, FileName);
// store path in the set
strSet.insert(str);

尽管我仍然不知道是什么导致了我在使用a set comparator (PathComp) for set<wchar_t*,PathComp> pathSet;时出现“调试断言失败”的问题

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5823469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档