Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.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/loops/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++ 到达STL容器';s size_类型使用变量_C++_Loops_Auto - Fatal编程技术网

C++ 到达STL容器';s size_类型使用变量

C++ 到达STL容器';s size_类型使用变量,c++,loops,auto,C++,Loops,Auto,我想以一种简单的方式编写基于索引的for循环。因为我的代码必须在32位和64位中运行,所以我收到很多关于隐式转换的警告,因为我通常使用32位整数,而STL在64位中使用64位整数 std::vector<MyClass> c; for (FOO ui = 0, uiEnd = c.size(); ui < uiEnd; ++ui){...} std::向量c; 对于(FOO ui=0,uiEnd=c.size();ui不会泄漏范围。@ BuffStReSeD:添加C++ C+

我想以一种简单的方式编写基于索引的for循环。因为我的代码必须在32位和64位中运行,所以我收到很多关于隐式转换的警告,因为我通常使用32位整数,而STL在64位中使用64位整数

std::vector<MyClass> c;
for (FOO ui = 0, uiEnd = c.size(); ui < uiEnd; ++ui){...}
std::向量c;
对于(FOO ui=0,uiEnd=c.size();ui
  • FOO=unsigned int
    在32位上工作,但在64位上生成警告
  • FOO=size\u t
    适用于32位和64位,但并不完全正确,因为标准不要求
    std::vector::size\u type==size\u t
  • FOO=auto
    不起作用(这很不幸),因为它分别为每个变量设置了类型,所以文本0(或0UL或其他)的类型不同于c.size()(在32或64位中,c.size()的类型可能不同,因此我无法编写正确的文本)
  • for(auto-uiEnd=c.size(),ui=0*uiEnd;ui
    通过使用正确的类型表示0来工作,但不清楚
  • FOO=decltype(c.size())
    有效,但我发现它不太清楚
  • FOO=std::vector::size\u type
    可以工作,但我发现重复容器的类型很乏味
我更喜欢像
FOO=c::size\u type
,它清楚地表达了正在发生的事情。但是,是否可以仅使用变量
c
获得
std::vector
size\u type
?我尝试了以下几件事,但没有成功:

  • c::size\u type
  • typeid(c)::size\u type
  • decltype(c)::size\u type
    • 而您可以使用:

      std::vector<MyClass> c;
      
      for (decltype(c)::size_type ui = 0, uiEnd = c.size(); ui < uiEnd; ++ui){...}
      
      std::向量c;
      对于(decltype(c)::size_type ui=0,uiEnd=c.size();ui
      我将使用:

      std::vector<MyClass> c;
      
      std::size_t index = 0; // as you want index too
      for (auto& myclass : c){...; ++index;}
      
      std::向量c;
      std::size\u t index=0;//因为你也需要索引
      对于(auto&myclass:c){…;++index;}
      
      甚至在C++20中:

      std::vector<MyClass> c;
      
      for (std::size_t index = 0; auto& myclass : c){...; ++index;}
      
      std::向量c;
      对于(std::size_t index=0;auto&myclass:c){…;++index;}
      
      不同但相关的问题:
      auto-uiEnd=c.size(),ui=0?不知道,把它扔出去就行了。
      decltype(c)::size\u type
      应该而且确实应该。如果它不适合您,那么我怀疑您的示例过于简化,无法表达为什么它不适合您。我仍然会使用
      std::size\t
      。如果发现
      向量
      ,其中
      大小类型
      不是
      大小类型
      ,则很可能使用比
      大小类型
      更小的类型。@StoryTeller:我使用的是Visual Studio 2010。decltype()支持似乎不完整。我得到一个错误::size_类型未定义,好像decltype和::size_类型之间有一个空格。如果是这种情况,我将选择decltype(c.size()),直到我可以更新我的编译器。谢谢你的评论!在C++ 20中,这将更好,在(AfAIK)当我们开始对基于/x的代码的<范围>代码时初始化另一个变量时,<>代码>索引>代码>不会泄漏范围。@ BuffStReSeD:添加C++ C++ 20版本。(对于短函数,范围不是问题)(XY解决方案IMO)。继续将跳过增量,这是意外错误的来源。