有没有办法在不使用循环的情况下非特定地引用映射中的每个值? C ++

时间:2019-06-13 14:52:42

标签: c++ qt dictionary

我有一个地图(嗯,一个QMap,但是我想知道std:map是否也具有QMap这个功能),我想一次访问其中的每个值(以便在上调用一个函数)具体来说,我正在尝试访问QWidgets并对其调用setVisible(false)

我可以使用循环或迭代器或类似的东西,但是看到我不需要我需要的值的任何特殊性,而我只需要对它们调用相同的简单函数,我想知道是否有一个函数或任何东西可以让您访问每个值。

3 个答案:

答案 0 :(得分:0)

如果元素数量有上限,则不需要循环就可以在地图的所有元素上调用函数:

auto map = init_map();
auto it = std::begin(map);
if(it != std::end(map))
    (it++)->second.setVisible(false);
if(it != std::end(map))
    (it++)->second.setVisible(false);
if(it != std::end(map))
    (it++)->second.setVisible(false);
if(it != std::end(map))
    (it++)->second.setVisible(false);
if(it != std::end(map))
    (it++)->second.setVisible(false);
if(it != std::end(map))
    (it++)->second.setVisible(false);
if(it != std::end(map))
    (it++)->second.setVisible(false);
if(it != std::end(map))
    (it++)->second.setVisible(false);

这可用于最多8个元素的地图。但是,这很愚蠢,可以通过使用循环大大简化。不过,您不必自己编写循环,因为您可以使用标准库提供的std::for_each

答案 1 :(得分:0)

  

我想知道是否有一个函数或任何东西可以让您访问每个值。

有一些选项(这里有更多选择),使它成为一个衬里,但是所有这些都会导致循环,可能在功能调用之后出现,也可能不会出现。

1) STL提供std::for_each

2) 但是简单的循环使for ( auto& x: m ) { x.second.Do(); }

更加方便

完整示例:

struct X
{
    int i;
    void Do() { std::cout << "Do called" << i << std::endl; }
};

int main()
{
    std::map<int, X> m;

    m[1]=X{10};
    m[3]=X{30};
    m[4]=X{40};

    std::for_each( m.begin(), m.end(), []( auto& x){ x.second.Do(); });

    // looks nicer for me:
    for ( auto& x: m ) { x.second.Do(); }
 }

内部所有结果都会循环,如果知道map的内容并且编译器非常聪明,也许编译器会优化并展开。

答案 2 :(得分:0)

是的,您可以使用ranges::view::values来获取序列对中的每个第二个元素。

例如

QMap<Key, QWidget *> items; // filled somehow

auto widgets = items | ranges::view::values | ranges::view::indirect;
std::for_each(widgets.begin(), widgets.end(), [](auto & widget){ widget.setVisible(false); });