相关疑难解决方法(0)

如何使用基于范围的for()循环与std :: map?

C++ 11基于范围的()循环的常见示例总是这样简单:

std::vector<int> numbers = { 1, 2, 3, 4, 5, 6, 7 };
for ( auto xyz : numbers )
{
     std::cout << xyz << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下xyz是一个int.但是,当我们有像地图这样的东西时会发生什么?此示例中变量的类型是什么:

std::map< foo, bar > testing = { /*...blah...*/ };
for ( auto abc : testing )
{
    std::cout << abc << std::endl;         // ? should this give a foo? a bar?
    std::cout << abc->first << std::endl;  // ? or is abc an iterator?
}
Run Code Online (Sandbox Code Playgroud)

当遍历的容器很简单时,看起来基于范围的()循环将给我们每个项目,而不是迭代器.哪个好...如果它是迭代器,我们总是要做的第一件事就是取消引用它.

但是,当涉及到地图和多重映射等内容时,我会感到困惑.

(我仍然使用g …

c++ dictionary for-loop c++11

316
推荐指数
4
解决办法
25万
查看次数

在基于范围的for循环中使用通用引用有什么好处?

const auto&如果我想执行只读操作就足够了.但是,我已经碰到了

for (auto&& e : v)  // v is non-const
Run Code Online (Sandbox Code Playgroud)

最近几次.这让我想知道:

是否有可能在一些不起眼的角落情况下,存在使用通用引用一些性能优势,相比auto&还是const auto&

(shared_ptr是一个晦涩角落案件的嫌疑人)


更新 我在收藏夹中找到的两个示例:

迭代基本类型时使用const引用的任何缺点?
我可以使用基于范围的for循环轻松迭代地图的值吗?

请专注于一个问题:我为什么要在使用自动&&范围为基础的for循环?

c++ performance for-loop move-semantics c++11

111
推荐指数
3
解决办法
2万
查看次数

与[[maybe_unused]]结构化绑定

具有模式匹配的函数式语言(有时?)有可能忽略一些绑定值,但是使用C++ 17结构化绑定似乎没有办法(std :: ignore with structured bindings?).建议是使用虚拟名称,但随后我们会收到有关未使用变量的警告.

有了clang和gcc的最新元首,这就做了预期的事情,这很好用,

[[maybe_unused]] auto x =4 ; // fine, no warning
[[maybe_unused]] auto [a,dummyb,dummyc] = std::tuple<int,int,float>(1,1,1.0f); 
Run Code Online (Sandbox Code Playgroud)

但我也希望这会奏效:

auto [g,[[maybe_unused]]dummyh,[[maybe_unused]]dymmyi] =
      std::tuple<int,int,float>(1,1,1.0f);
Run Code Online (Sandbox Code Playgroud)

是否有一个特定的原因属性不能在这里使用?(在标准和技术上).gcc或clang都不接受这个.


编辑,收集支持状态:(感谢godbolt /编译器浏览器).它按预期工作(也可能更早):

  • gcc 8.0 trunk(g ++ 8.0.0 20171015实验)
  • 铿锵4.0.0
  • icc 18(未经测试,根据规格)

MSVC 17.3.5(和Visual Studio GUI)允许该属性,但它不适用于结构化绑定.错误报告

c++ c++17 structured-bindings

37
推荐指数
2
解决办法
4290
查看次数