我想知道是否有任何内置或完善的方式(即通过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)
感谢您的任何反馈.
我正在分配一块带有输入大小的临时存储器,我想使用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>.根据我的测试,new和delete操作符按预期调用.由于这是一种不常见的用法(即operator new明确使用),我想检查一下这没有什么问题?是否有更好/更清洁的替代方案?
如果我有两个COM接口指针(即ID3D11Texture2D),并且我想检查它们是否是相同的底层类实例,我可以直接比较两个指针是否相等?在完成比较之前,我已经看到了将代码转换为其他内容的代码,因此需要确认.
BOOL IsEqual (ID3D11Texture2D *pTexture1, ID3D11Texture2D *pTexture2)
{
    if (pTexture1 == pTexture2)
    {
        return true;
    }
    else
    {
        return false;
    }
} 
Run Code Online (Sandbox Code Playgroud)
谢谢.
在www.CPlusPlus.com上,它说明了unordered_multimap的以下内容,
具有等效键的元素在同一个桶中组合在一起,并且迭代器(请参阅equal_range)可以遍历所有这些元素.
我知道我们无法从该语句中推断出这一点,但我想知道给定的存储桶是否只包含具有等效键的元素?
给定无符号整数,我想知道是否有办法确定是否在单个操作中设置了多个位.已经有一种替代方法可以通过逐位检查来实现这一点(如下所示),但我想知道是否有办法集中检查所有位.
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) 我试图更好地了解 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) 我已经读过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++ ×7
c++11 ×3
windows ×2
com ×1
new-operator ×1
size-t ×1
std ×1
stdlist ×1
unique-ptr ×1
visual-c++ ×1