我有一个地图(嗯,一个QMap,但是我想知道std:map是否也具有QMap这个功能),我想一次访问其中的每个值(以便在上调用一个函数)具体来说,我正在尝试访问QWidgets并对其调用setVisible(false)
。
我可以使用循环或迭代器或类似的东西,但是看到我不需要我需要的值的任何特殊性,而我只需要对它们调用相同的简单函数,我想知道是否有一个函数或任何东西可以让您访问每个值。
答案 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); });