相关疑难解决方法(0)

std :: ignore with structured bindings?

序幕:

std::tuple<int, int, int> f();
std::tuple<int, int, float, int> g();
Run Code Online (Sandbox Code Playgroud)

C++ 1z将引入结构化绑定的语法,这样可以编写代替

int a, b, c;
std::tie(a, b, c) = f();
Run Code Online (Sandbox Code Playgroud)

就像是

auto [a, b, c] = f();
Run Code Online (Sandbox Code Playgroud)

但是,std::tie也允许指定std::ignore忽略某些组件,例如:

std::tie(a, b, std::ignore, c) = g();
Run Code Online (Sandbox Code Playgroud)

是否可以使用新的结构化绑定语法执行类似的操作?它会如何工作?

c++ language-lawyer c++17

61
推荐指数
4
解决办法
8767
查看次数

一个C++迭代器适配器,它包装和隐藏内部迭代器并转换迭代类型

玩弄了这个,我怀疑它不可能,但我想我会问专家.我有以下C++代码:

class IInterface
{
    virtual void SomeMethod() = 0;
};

class Object
{
    IInterface* GetInterface() { ... }
};

class Container
{
private:
    struct Item
    {
        Object* pObject;
        [... other members ...]
    };
    std::list<Item> m_items;
};

我想将这些方法添加到Container:

    MagicIterator<IInterface*> Begin();
    MagicIterator<IInterface*> End();

为了让呼叫者可以写:

Container c = [...]
for (MagicIterator<IInterface*> i = c.Begin(); i != c.End(); i++)
{
    IInterface* pItf = *i;
    [...]
}

所以基本上我想提供一个类似乎迭代某些集合(其中Begin()和End()的调用者不允许看到)的IInterface指针,但它实际上迭代了指向其他指针的指针集合.对象(Container类专用),可以转换为IInterface指针.

几个关键点:

  • MagicIterator是在外面定义的Container.
  • Container::Item 必须保持私密.
  • MagicIterator有遍历IInterface,指针尽管事实Container持有std::list<Container::Item>.Container::Item包含一个 …

c++ templates iterator adapter wrapper

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

C++中迭代器的键/值功能

我知道这些问题之前有各种各样的问题,但这有点不同.

我有一个包含std :: map的类.虽然我希望在类中使用映射用于其他目的,但在外部我想要将迭代器适配器暴露给映射内的值(即std :: pair中的第二项).

例如在python中我可能会这样做:

def __iter__(self):
    return self._dict.itervalues()
Run Code Online (Sandbox Code Playgroud)

我如何在c ++中执行此操作,将实现隐藏在类中?

谢谢,

c++ iterator stl map

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

std :: list和std :: map的常用算法?

我有一类兴趣(称之为X).
我有一个std :: list <X*>(称之为L).
我有一个功能(称之为F).

F(L)根据检查列表中每个X的内部状态的算法返回L的子集(std :: list <X*>).

我在我的应用程序中添加了一个std :: map <int,X*>(称之为M),我需要定义F(M)以与F(L)相同的方式运行 - 也就是说, F(M)也必须返回一个std :: list <X*>,通过检查地图中每个X的内部状态来确定.

作为一个自我描述的懒惰程序员,我立即看到该算法将[逻辑]相同,并且每个数据类型(std :: list和std :: map)都是可迭代的模板.我不想两次保持相同的算法,但我不确定如何继续前进.

一种方法是从F(M)中取出X*(即键值映射中的'值'),将它们放入std :: list <X*>中,并将处理过去到F(std :: list <X*>),传递返回std :: list <X*>; 回过头来.我看不出这是唯一的方法.

我的问题:如何在一个地方维护核心算法,但保留迭代序​​列或对关联容器的值的能力?

谢谢!

c++ algorithm stl list map

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

为什么std :: map没有提供key_iterator和value_iterator?

我在C++ 03环境中工作,并将一个函数应用于地图的每个键是很多代码:

const std::map<X,Y>::const_iterator end = m_map.end();
for (std::map<X,Y>::const_iterator element = m_map.begin(); element != end; ++element)
{
   func( element->first );
}
Run Code Online (Sandbox Code Playgroud)

如果key_iterator存在,相同的代码可以利用std::for_each:

std::for_each( m_map.key_begin(), m_map.key_end(), &func );
Run Code Online (Sandbox Code Playgroud)

那为什么不提供呢?有没有办法让第一种模式适应第二种模式?

c++ iterator stdmap standard-library c++03

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