C++ 到达STL容器';s size_类型使用变量
我想以一种简单的方式编写基于索引的for循环。因为我的代码必须在32位和64位中运行,所以我收到很多关于隐式转换的警告,因为我通常使用32位整数,而STL在64位中使用64位整数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+
std::vector<MyClass> c;
for (FOO ui = 0, uiEnd = c.size(); ui < uiEnd; ++ui){...}
std::向量c;
对于(FOO ui=0,uiEnd=c.size();ui
在32位上工作,但在64位上生成警告FOO=unsigned int
适用于32位和64位,但并不完全正确,因为标准不要求FOO=size\u t
std::vector::size\u type==size\u t
不起作用(这很不幸),因为它分别为每个变量设置了类型,所以文本0(或0UL或其他)的类型不同于c.size()(在32或64位中,c.size()的类型可能不同,因此我无法编写正确的文本)FOO=auto
通过使用正确的类型表示0来工作,但不清楚for(auto-uiEnd=c.size(),ui=0*uiEnd;ui
有效,但我发现它不太清楚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)。继续将跳过增量,这是意外错误的来源。