Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法不使用循环而非特定地引用映射中的每个值?C++_C++_Qt_Dictionary - Fatal编程技术网

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

有没有办法不使用循环而非特定地引用映射中的每个值?C++,c++,qt,dictionary,C++,Qt,Dictionary,我有一个映射,一个QMap,但我猜如果std:map也有这个功能,QMap也会有,我想一次访问其中的每个值,以便对所有值调用一个函数。具体地说,我正在尝试访问QWidgets,并在所有这些小部件上调用setVisiblefalse 我可以使用循环或迭代器或类似的东西,但鉴于我不需要任何特定的值,我只需要对它们调用相同的简单函数,我想知道是否有一个函数或任何东西可以让你访问每个值。如果你有元素数量的上限,这样,就不需要循环来调用映射的所有元素上的函数: auto map = init_map();

我有一个映射,一个QMap,但我猜如果std:map也有这个功能,QMap也会有,我想一次访问其中的每个值,以便对所有值调用一个函数。具体地说,我正在尝试访问QWidgets,并在所有这些小部件上调用setVisiblefalse


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

如果你有元素数量的上限,这样,就不需要循环来调用映射的所有元素上的函数:

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_

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

这里给出了一些选项和更多选项,使它成为一个单行程序,但所有结果都在一个循环中,可能在函数调用后面,也可能不在后面

一, STL为每个用户提供std::for

二, 但是使用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(); }
 }
在内部,所有结果都是一个循环,如果已知映射的内容并且编译器非常聪明,那么编译器可能会进行优化和展开。

是的,您可以使用获取成对序列的每一个第二个元素

例如


循环有什么问题?特别是考虑到handy,它可以与使用auto的类型推断一起很好地工作。如果您不想自己编写循环,您也可以使用std::for_eachNB:如果小部件具有相同的父项,您可以隐藏该父项您可以始终为关联容器编写访问者,但最终还是会有某种形式的循环。这只是一个如何隐藏循环的问题。如果写一个循环会让你感到困扰,可以将它隐藏在函数或对象后面。不过,未来的维护人员可能不同意您的决定。
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); });