小编Fai*_*alM的帖子

使用不遵循"严格弱排序"的比较函数对列表进行排序

我有10个项目的清单.我想以特定的方式对它们进行排序.

例如.项目是A1,B,C1,A2,A3,F,G,C2,H,A4

规则是

  • C应该总是在A之前
  • B应该总是在A之后
  • 所有其他项目应保留其订单.

所以排序后的列表应按此顺序C1 C2 A1 A2 A3 FGH A4 B.

我正在尝试使用C++ std::stable_sort()方法来实现这一目标.在我的程序中,所有项目都是结构"SItem"的实例,它有一个成员"类型"来表示其类别(A,B等).我的比较函数看起来像这样

bool CompareItems(SItem const& item1, SItem const& item2) 
{
    if (item1.type == A && item2.type == C)
        return false;

    if (item1.type == B && item2.type == A)
        return false;

    return true;
}
Run Code Online (Sandbox Code Playgroud)

根据我的理解stable_sort,它要求比较函数遵循'严格弱排序'.显然我的方法不遵循,所以我不能使用stable_sort.他们的排序算法是否可用于实现此类订单?

完整的代码

#include <list>
#include <algorithm>
#include <iostream>

enum ItemType
{
    A, B, C, D, E, F, G, H,
};

struct SItem
{
    SItem(ItemType t, int i) {
        type = …
Run Code Online (Sandbox Code Playgroud)

c++ sorting algorithm

10
推荐指数
2
解决办法
1254
查看次数

在C++中按值传递数组和引用之间的区别

以下两个函数test1和test2之间是否有任何区别

static int const MAXL = 3;

void test1(int t[MAXL])
{
    for (int i = 0; i < MAXL; ++i)
        t[i] = 10;   
}

void test2(int (&t)[MAXL])
{
   for (int i = 0; i < MAXL; ++i)
       t[i] = 10;    
}
Run Code Online (Sandbox Code Playgroud)

通过我在MSVC2008中的测试,两个函数都修改了输入数组值.它们的功能似乎都是相同的.

任何人都可以提供一个需要在函数参数中引用数组的情况吗?

c++

5
推荐指数
1
解决办法
1483
查看次数

将双精度数转换为整数尾数和指数

我正在尝试从双精度数中提取尾数和指数部分。对于测试数据“0.15625”,预期尾数和指数分别为“5”和“-5”(5*2^-5)。

double value = 0.15625; 
double mantissa  = frexp(value, &exp);
Run Code Online (Sandbox Code Playgroud)

Result: mantissa = 0.625 and exp = -2

这里返回的尾数是分数。对于我的用例(ASN.1 编码),尾数应该是整数。据我所知,通过右移尾数并调整指数,我可以将二进制分数转换为整数。例如,0.625 base 10is 0.101 base 2、 so3字节被移位以获得整数。但我发现很难找到通用算法。

所以我的问题是,如何计算将十进制小数转换为二进制整数所需移位的位数?

c++ floating-point asn.1

3
推荐指数
1
解决办法
1459
查看次数

WaitForSingleObject() 不返回 WAIT_ABANDONED

我有一个 MFC 应用程序。在 InitInstance() 中,我创建了一个命名互斥体,并通过调用 WaitForSingleObject() 立即获取它。在 ExitInstance() 中,互斥体被释放。

BOOL CMyApp::InitInstance()
{
    m_hMutex = CreateMutex( NULL, FALSE, "MyAppMutex" );
    DWORD dwRes = WaitForSingleObject( m_hMutex, INFINITE );
    switch( dwRes )
    {
    case WAIT_ABANDONED:
        break;
    case WAIT_OBJECT_0:
        break;
    }
}

BOOL CMyApp::ExitInstance()
{
    ::ReleaseMutex( m_hMutex );
    ::CloseHandle( m_hMutex );
}
Run Code Online (Sandbox Code Playgroud)

我从互斥体文档中了解到的是,如果一个进程退出而没有释放所获取的互斥体,则当另一个进程尝试获取它时,WaitForXXXObject() 将返回 WAIT_ABANDONED。

为了测试这一点,我运行了我的应用程序并使用任务管理器杀死了它,这样 ReleaseMutex 就不会被调用。但是当我再次运行应用程序时,InitInstance() 中的 WaitForSingleObject() 返回 WAIT_OBJECT_0。这是预期的行为吗?

c++ mfc multithreading

1
推荐指数
1
解决办法
775
查看次数

比较两个用户定义的类型向量

我正在尝试使用!=比较两个向量,但是VS2015显示了这些错误。

Error   C2672   'operator __surrogate_func': no matching overloaded function found  
Error   C2893   Failed to specialize function template 'unknown-type std::equal_to<void>::operator ()(_Ty1 &&,_Ty2 &&) const'
Run Code Online (Sandbox Code Playgroud)

码:

#include <vector>
struct Pixel 
{
    int m_nX;
    int m_nY;

    Pixel(int x, int y)
    {
        m_nX = x;
        m_nY = y;
    }
};

int main()
{
    std::vector<Pixel> vtrPixels1;
    vtrPixels1.emplace_back(1, 2);
    vtrPixels1.emplace_back(3, 4);

    std::vector<Pixel> vtrPixels2;
    vtrPixels2.emplace_back(2, 2);
    vtrPixels2.emplace_back(3, 4);

    if (vtrPixels1 != vtrPixels2)
        vtrPixels1 = vtrPixels2;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++

1
推荐指数
1
解决办法
152
查看次数

标签 统计

c++ ×5

algorithm ×1

asn.1 ×1

floating-point ×1

mfc ×1

multithreading ×1

sorting ×1