Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/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++;_C++_C++11_C++17 - Fatal编程技术网

C++ 在c++;

C++ 在c++;,c++,c++11,c++17,C++,C++11,C++17,我有一个使用while语句的代码。在…内 我对条件表达式执行查找。同时,条件表达式检查返回值: #include <map> struct a { a *up; std::map<int,int> tbl; }; void p(a *_a, int id) { decltype(_a->tbl)::iterator i; while (_a && (i = _a->tbl.find(id)) != _a-&g

我有一个使用while语句的代码。在…内 我对条件表达式执行查找。同时,条件表达式检查返回值:

#include <map>

struct a {
    a *up;
    std::map<int,int> tbl;
};

void p(a *_a, int id) {
    decltype(_a->tbl)::iterator i;
    while (_a && (i = _a->tbl.find(id)) != _a->tbl.end()) {
        i->second += 1;
        _a = _a->up;
    }
}

int main(int arc, char **argv) {
    a _a1{0,{{0,10},{1,10}}};
    a _a0{&_a1,{{2,11},{3,11}}};
    p(&_a0, 0);
    return 0;
}

在c++11/14/17中是否有一个结构在表达式中支持这种声明?不仅
while(autoi=1){…}
样式声明?也许有一些新功能允许这样做?

将这两种情况分开怎么样?循环继续的主循环是
\u a
,次循环(可能总是正确的)是
\u a->tbl.find(id)!=_a->tbl.end()
。否定的回报:

void p(a *_a, int id) {
    while (_a) {
        auto i = _a->tbl.find(id);
        if (i == _a->tbl.end()) {
            return;
        }
        i->second += 1;
        _a = _a->up;
    }
}

把这两个条件分开怎么样?循环继续的主循环是
\u a
,次循环(可能总是正确的)是
\u a->tbl.find(id)!=_a->tbl.end()
。否定的回报:

void p(a *_a, int id) {
    while (_a) {
        auto i = _a->tbl.find(id);
        if (i == _a->tbl.end()) {
            return;
        }
        i->second += 1;
        _a = _a->up;
    }
}


您可以使用新的C++17 init,但仍然需要更新
i
,不确定什么更好。它长了好几行,但是您可以从条件循环中获得赋值。这将需要10行而不是4行。@MatthieuBrucher:看起来gcc内部似乎不支持init。它在
if
中使用init时支持它。但是
while(decltype(\u a->tbl)::迭代器i;\u a&((i=\u a->tbl.find(id))!=\u a->tbl.end()
在gcc 8.2中返回一个错误。While循环不能有init语句。没有编译器应该支持这一点。哦,事实上,只有
for
if
。我的错。@MatthieuBrucher和
switch
。你可以使用新的C++17 init,但你仍然需要更新
i
,不确定哪一行更好。它长了好几行,但是你可以从条件循环中得到赋值。它需要10行而不是4行。@MatthieuBrucher:gcc似乎不支持while中的init。它在
if
中使用init时支持它。但是
while(decltype(_a->tbl)::迭代器i;_a&((i=_a->tbl.find(id))!=_a->tbl.end())
在gcc 8.2中返回一个错误。While循环不能有init语句。没有编译器应该支持它。哦,事实上,只有
for
if
。我的错。@MatthieuBrucher和
switch
。谢谢,但我正在搜索密集版本,我可以在表达式的任何地方添加一个auto。我想没有这样的构造可以得到这项工作。@KonradEisele我想没有,但即使有一个,我也不会在两个条件明确分离的情况下使用它。主要是因为它们没有相同的“优先级”,如果你愿意的话。我想这是一个品味问题。从逻辑上讲,这两个测试都是循环退出条件,所以我希望它们驻留在循环条件表达式中,而不是使用
break
,因为break语句可能需要滚动才能看到。@KonradEisele我从来没有编写过类似的
break
指令“代码<返回> <代码>。我确信,在这里,你可以用一个相对短的函数来处理这种情况,其中一个“<代码>返回<代码>有它的位置。当然,我不能证明。你可能是对的。我怀疑未来的C++标准最终会建立足够的类型推断,从而使EV。en
auto
将是可选的,我可以让我的
I
自动声明。谢谢,但我正在搜索密集版本,我可以在表达式中的任何位置添加一个auto。我想没有这样的构造来完成这项工作。@KonradEisele我想没有,但即使有,我也永远不会使用它这两个条件的明确区分。主要是因为它们没有相同的“优先级”,如果你愿意的话。我想这是一个品味问题。从逻辑上讲,这两个测试都是循环退出条件,所以我希望它们驻留在循环条件表达式中,而不是使用
break
,因为break语句可能需要滚动才能看到。@KonradEisele我从来没有编写过类似的
break
指令“代码<返回> <代码>。我确信,在这里,你可以用一个相对短的函数来处理这种情况,其中一个“<代码>返回<代码>有它的位置。当然,我不能证明。你可能是对的。我怀疑未来的C++标准最终会建立足够的类型推断,从而使EV。en
auto
将是可选的,我可以让我的
I
自动声明。