<legend id='FyXfw'><style id='FyXfw'><dir id='FyXfw'><q id='FyXfw'></q></dir></style></legend>
    <bdo id='FyXfw'></bdo><ul id='FyXfw'></ul>
  • <small id='FyXfw'></small><noframes id='FyXfw'>

    <i id='FyXfw'><tr id='FyXfw'><dt id='FyXfw'><q id='FyXfw'><span id='FyXfw'><b id='FyXfw'><form id='FyXfw'><ins id='FyXfw'></ins><ul id='FyXfw'></ul><sub id='FyXfw'></sub></form><legend id='FyXfw'></legend><bdo id='FyXfw'><pre id='FyXfw'><center id='FyXfw'></center></pre></bdo></b><th id='FyXfw'></th></span></q></dt></tr></i><div id='FyXfw'><tfoot id='FyXfw'></tfoot><dl id='FyXfw'><fieldset id='FyXfw'></fieldset></dl></div>
    <tfoot id='FyXfw'></tfoot>

        迭代 std::vector:无符号与有符号索引变量

        Iteration over std::vector: unsigned vs signed index variable(迭代 std::vector:无符号与有符号索引变量)
          <tbody id='l4NHg'></tbody>
        • <small id='l4NHg'></small><noframes id='l4NHg'>

            • <bdo id='l4NHg'></bdo><ul id='l4NHg'></ul>
                <tfoot id='l4NHg'></tfoot>
                <i id='l4NHg'><tr id='l4NHg'><dt id='l4NHg'><q id='l4NHg'><span id='l4NHg'><b id='l4NHg'><form id='l4NHg'><ins id='l4NHg'></ins><ul id='l4NHg'></ul><sub id='l4NHg'></sub></form><legend id='l4NHg'></legend><bdo id='l4NHg'><pre id='l4NHg'><center id='l4NHg'></center></pre></bdo></b><th id='l4NHg'></th></span></q></dt></tr></i><div id='l4NHg'><tfoot id='l4NHg'></tfoot><dl id='l4NHg'><fieldset id='l4NHg'></fieldset></dl></div>

                  <legend id='l4NHg'><style id='l4NHg'><dir id='l4NHg'><q id='l4NHg'></q></dir></style></legend>

                  本文介绍了迭代 std::vector:无符号与有符号索引变量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                  问题描述

                  在 C++ 中迭代向量的正确方法是什么?

                  What is the correct way of iterating over a vector in C++?

                  考虑这两个代码片段,这个可以正常工作:

                  Consider these two code fragments, this one works fine:

                  for (unsigned i=0; i < polygon.size(); i++) {
                      sum += polygon[i];
                  }
                  

                  还有这个:

                  for (int i=0; i < polygon.size(); i++) {
                      sum += polygon[i];
                  }
                  

                  生成警告:有符号和无符号整数表达式之间的比较.

                  我是 C++ 世界的新手,所以 unsigned 变量对我来说看起来有点吓人,我知道 unsigned 变量如果使用不当会很危险,所以 - 这是正确的吗?

                  I'm new in the world of C++, so the unsigned variable looks a bit frightening to me and I know unsigned variables can be dangerous if not used correctly, so - is this correct?

                  推荐答案

                  要向后迭代,请参阅 这个答案.

                  For iterating backwards see this answer.

                  向前迭代几乎相同.只需按增量更改迭代器/交换递减.你应该更喜欢迭代器.有些人告诉您使用 std::size_t 作为索引变量类型.但是,这不是便携式的.始终使用容器的 size_type typedef(虽然在向前迭代的情况下你可以只进行一次转换,但在使用 std 时在向后迭代的情况下它实际上可能一直出错::size_t,以防 std::size_tsize_type 的 typedef 更宽):

                  Iterating forwards is almost identical. Just change the iterators / swap decrement by increment. You should prefer iterators. Some people tell you to use std::size_t as the index variable type. However, that is not portable. Always use the size_type typedef of the container (While you could get away with only a conversion in the forward iterating case, it could actually go wrong all the way in the backward iterating case when using std::size_t, in case std::size_t is wider than what is the typedef of size_type):

                  for(std::vector<T>::iterator it = v.begin(); it != v.end(); ++it) {
                      /* std::cout << *it; ... */
                  }
                  

                  重要的是,对于您不知道定义的迭代器,始终使用前缀增量形式.这将确保您的代码尽可能通用.

                  Important is, always use the prefix increment form for iterators whose definitions you don't know. That will ensure your code runs as generic as possible.

                  for(auto const& value: a) {
                       /* std::cout << value; ... */
                  

                  使用索引

                  for(std::vector<int>::size_type i = 0; i != v.size(); i++) {
                      /* std::cout << v[i]; ... */
                  }
                  

                  <小时>

                  使用数组

                  使用迭代器

                  for(element_type* it = a; it != (a + (sizeof a / sizeof *a)); it++) {
                      /* std::cout << *it; ... */
                  }
                  

                  使用范围 C++11

                  for(auto const& value: a) {
                       /* std::cout << value; ... */
                  

                  使用索引

                  for(std::size_t i = 0; i != (sizeof a / sizeof *a); i++) {
                      /* std::cout << a[i]; ... */
                  }
                  

                  阅读向后迭代的答案,但是 sizeof 方法可以解决什么问题.

                  Read in the backward iterating answer what problem the sizeof approach can yield to, though.

                  这篇关于迭代 std::vector:无符号与有符号索引变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                  本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

                  相关文档推荐

                  What is the past-the-end iterator in STL C++?(STL C++ 中的最后迭代器是什么?)
                  vector::at vs. vector::operator[](vector::at 与 vector::operator[])
                  C++ equivalent of StringBuffer/StringBuilder?(C++ 等效于 StringBuffer/StringBuilder?)
                  Adding types to the std namespace(将类型添加到 std 命名空间)
                  Is the C++ std::set thread-safe?(C++ std::set 线程安全吗?)
                  How to use std::find/std::find_if with a vector of custom class objects?(如何将 std::find/std::find_if 与自定义类对象的向量一起使用?)

                        • <bdo id='ObLLo'></bdo><ul id='ObLLo'></ul>
                        • <i id='ObLLo'><tr id='ObLLo'><dt id='ObLLo'><q id='ObLLo'><span id='ObLLo'><b id='ObLLo'><form id='ObLLo'><ins id='ObLLo'></ins><ul id='ObLLo'></ul><sub id='ObLLo'></sub></form><legend id='ObLLo'></legend><bdo id='ObLLo'><pre id='ObLLo'><center id='ObLLo'></center></pre></bdo></b><th id='ObLLo'></th></span></q></dt></tr></i><div id='ObLLo'><tfoot id='ObLLo'></tfoot><dl id='ObLLo'><fieldset id='ObLLo'></fieldset></dl></div>
                          <legend id='ObLLo'><style id='ObLLo'><dir id='ObLLo'><q id='ObLLo'></q></dir></style></legend>

                        • <tfoot id='ObLLo'></tfoot>
                            <tbody id='ObLLo'></tbody>

                            <small id='ObLLo'></small><noframes id='ObLLo'>