小编lan*_*ery的帖子

在std :: list中查找所有匹配的元素

我想知道是否有任何内置或完善的方式(即通过lambda)来浏览std :: list的元素并找到所有匹配给定值的元素?我知道我可以遍历所有这些,但我想我会问是否有办法让迭代器只迭代符合给定条件的元素?我下面的示例只给出了第一个匹配元素的迭代器.

#include <list>
#include <algorithm>
#include <stdio.h>

int main()
{
    std::list<int> List;
    List.push_back(100);
    List.push_back(200);
    List.push_back(300);
    List.push_back(100);
    int findValue = 100;

    auto it = std::find_if(List.begin(), List.end(), [findValue](const int value)
    {
        return (value == findValue);
    });

    if (it != List.end())
    {
        for (; it != List.end(); ++it)
        {
            printf("%d\n", * it);
        }
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

感谢您的任何反馈.

c++ stdlist c++11

7
推荐指数
3
解决办法
3万
查看次数

如何将unique_ptr与operator new一起使用

我正在分配一块带有输入大小的临时存储器,我想使用a unique_ptr来跟踪正确的生命周期而不必明确担心自己释放它.这就是我想出的:

{
    std::unique_ptr<BYTE> sp;
    sp.reset(reinterpret_cast<BYTE*>(operator new (100)));
}
Run Code Online (Sandbox Code Playgroud)

我不得不使用,BYTE因为MSVC不会编译std::unique_ptr<void>.根据我的测试,newdelete操作符按预期调用.由于这是一种不常见的用法(即operator new明确使用),我想检查一下这没有什么问题?是否有更好/更清洁的替代方案?

c++ windows new-operator unique-ptr c++11

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

检查COM指针是否相等

如果我有两个COM接口指针(即ID3D11Texture2D),并且我想检查它们是否是相同的底层类实例,我可以直接比较两个指针是否相等?在完成比较之前,我已经看到了将代码转换为其他内容的代码,因此需要确认.

BOOL IsEqual (ID3D11Texture2D *pTexture1, ID3D11Texture2D *pTexture2)
{
    if (pTexture1 == pTexture2)
    {
        return true;
    }
    else
    {
        return false;
    }
} 
Run Code Online (Sandbox Code Playgroud)

谢谢.

c++ com

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

std :: unordered_multimap的存储桶是否仅包含具有等效键的元素

在www.CPlusPlus.com上,它说明了unordered_multimap的以下内容,

具有等效键的元素在同一个桶中组合在一起,并且迭代器(请参阅equal_range)可以遍历所有这些元素.

我知道我们无法从该语句中推断出这一点,但我想知道给定的存储桶是否包含具有等效键的元素?

c++ unordered-map std

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

如何统一检查位是否设置为无符号整数?

给定无符号整数,我想知道是否有办法确定是否在单个操作中设置了多个位.已经有一种替代方法可以通过逐位检查来实现这一点(如下所示),但我想知道是否有办法集中检查所有位.

typedef enum Foo_X
{
  Foo_0 = 0x1,
  Foo_1 = 0x2,
  Foo_2 = 0x4,
  Foo_3 = 0x8,
} Foo_X;

bool CheckFoo ( UINT Value, Foo_X Foo_to_Check )
{
    if (Value & Foo_to_Check)
    {
        // Foo_to_Check is present
        return true;
    }
}

void main()
{
    UINT value = GetValueFromSomewhere();
    if (CheckFoo(value, Foo_0) && CheckFoo(value, Foo_3))
        // both Foo_0 and Foo_3 are present
    else
        // not both present
}
Run Code Online (Sandbox Code Playgroud)

使用集合方法的示例也如下所示.有任何想法吗?TIA!

bool CheckFooTogether ( UINT Value, UINT Foos_to_Check )
{
    // check value …
Run Code Online (Sandbox Code Playgroud)

c++ bit-manipulation

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

没有移动/复制构造函数的 std::unordered_map::emplace 行为

我试图更好地了解 std::unordered_map::emplace,并且我想我了解复制和移动构造函数(如果它们存在)是如何被利用的。我在下面概述了每种不同用法的相关描述。如果有人发现描述有任何问题,请告诉我。

然而,我最好奇的是,当只定义了默认和用户定义的构造函数时会发生什么?看起来默认构造函数根本没有调用,自定义构造函数只调用了ONCE,那么unordered_map中新构造元素的FooBar成员是怎么填充的呢?(我想默认/用户定义的构造函数至少被调用两次)。另外,如果 FooBar 没有定义复制和移动构造函数,下面的 3 种情况是否有任何行为差异?

注意:我知道这是一个微不足道的例子,其中深拷贝不是问题,所以复制/移动语义并没有真正产生任何显着的收益。我只是使用这个简化的例子来表达我的观点。

struct FooBar
{
    FooBar()
    {
        printf("Foobar default constructor called\n");
    };

    FooBar(int* pFoo, int* pBar)
    {
        m_pFoo = pFoo;
        m_pBar = pBar;
        printf("Foobar user-defined constructor called\n");
    };

    FooBar(FooBar & rhs)
    {
        m_pBar = rhs.m_pBar;
        m_pFoo = rhs.m_pFoo;
        printf("Foobar copy constructor called\n");
    };

    FooBar(FooBar && rhs)
    {
        m_pBar = rhs.m_pBar;
        m_pFoo = rhs.m_pFoo;
        rhs.m_pBar = nullptr;
        rhs.m_pFoo = nullptr;
        printf("Foobar move constructor called\n");
    };

    int* m_pFoo;
    int* m_pBar;
};


int _tmain(int argc, _TCHAR* argv[]) …
Run Code Online (Sandbox Code Playgroud)

c++ unordered-map visual-c++ c++11

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

在Windows上SIZE_T和void*之间进行转换

我已经读过stackoverflow上的几篇帖子,比如size_t和uintptr_t,sizeof(size_t)== sizeof(void*)总是如此?并且理解根据C++标准,SIZE_T和void*的大小可以不同,以考虑诸如16位分段体系结构的体系结构.

所以我想将我的场景平台限制为Windows,无论是x86,x64,WoA(Windows on Arm):在Windows上,如果我在malloc中创建一个void*类型的指针,我想做指针 - 在将它传递给memcpy或其他东西之前的算法,我必须这样:

void* p = malloc(100);
memcpy(reinterpret_cast<void*>((reinterpret_cast<SIZE_T>(p) + offset), p2, 100);
Run Code Online (Sandbox Code Playgroud)

这看起来非常乏味,特别是如果你不得不在各处乱扔这种类型的铸件(我正在处理各种偏移).鉴于这是在Windows平台上,我想知道是否有一些简化可以减少这种类型的样板代码?

谢谢.

c++ windows size-t

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