【问题标题】:C++ vector resizeC++ 向量调整大小
【发布时间】:2021-04-09 15:05:04
【问题描述】:

有一个练习我一直卡在下面:

#include <iostream>
#include <vector>
using namespace std;

int main() {
 const int PAGE_SIZE = 4;
 vector<int> sizes = {3, 6, 8, 11, 0, 15, 9};

 vector<int> v;
 cout << v.size() << endl;
 for (int i = 0; i < sizes.size(); i++ ){
   int pages = sizes.at(i) / PAGE_SIZE;
   if ( sizes.at(i) % PAGE_SIZE ) pages++;
   v.resize( pages * PAGE_SIZE );
   cout << v.size() << endl;
 }

 return 0;
}

对于上面的程序,把正在打印的数字按正确的顺序排列!

这个问题的答案和正确的顺序是:

0
4
8
8
12
0
16
12

我一直在尝试解决它,但不太了解 if 语句与模运算符的结合。有人可以帮我解释一下吗?

【问题讨论】:

  • 您不需要任何人向您解释这一点。可以向您解释一切的是您的调试器。您是否知道调试器可以在任何给定点向您展示程序如何运行,一次一行,所有变量如何变化,它们的值是什么,您甚至可以设置断点以在它们发生时触发?知道如何有效地使用调试器是每个 C++ 开发人员都必须学习的东西,这对您来说是一个很好的机会!知道如何使用调试器意味着您永远不必请任何人帮助您编写代码。
  • 如果您询问int pages = sizes.at(i) / PAGE_SIZE; if ( sizes.at(i) % PAGE_SIZE ) pages++; 的含义,则计算sizes.at(i) 除以PAGE_SIZE,四舍五入。普通除法 / 给出向下取整的答案(准确地说是截为零),然后这个答案加一,除非 sizes.at(i) 可以被 PAGE_SIZE 整除。
  • 如果你问的是v.resize( pages * PAGE_SIZE ); cout &lt;&lt; v.size() &lt;&lt; endl;,那只是实现cout &lt;&lt; pages * PAGE_SIZE的一种非常不正当的方式

标签: c++ vector resize


【解决方案1】:

它基本上描述了天花板操作的行为(总是向上取整):

#include <iostream>
#include <vector>
using namespace std;

int main() {
    const int PAGE_SIZE = 4;
    vector<int> sizes = {3, 6, 8, 11, 0, 15, 9};
    // The vector v has size 0
    vector<int> v;
    
    // Loops through the vector 'sizes'
    for (int i = 0; i < sizes.size(); i++ ){
        // divides the current size by PAGE_SIZE to get the var 'pages'
        int pages = sizes.at(i) / PAGE_SIZE;
        // If the current size is not a multiple of PAGE_SIZE, 
        // increases the var 'pages', otherwise lets it unchanged
        if ( sizes.at(i) % PAGE_SIZE ) pages++;
        // Resizes v to page * PAGE_SIZE and prints its size
        v.resize( pages * PAGE_SIZE );
        cout << v.size() << endl;
    }
    return 0;
}

因此 v.size 成为初始大小的上限

the size is 3,  pages becomes 1 and the vector has a size of 4
the size is 6,  pages becomes 2 and the vector has a size of 8
the size is 8,  pages becomes 2 and the vector has a size of 8
the size is 11, pages becomes 3 and the vector has a size of 12
the size is 0,  pages becomes 0 and the vector has a size of 0
the size is 15, pages becomes 4 and the vector has a size of 16
the size is 9,  pages becomes 3 and the vector has a size of 12

【讨论】:

    【解决方案2】:

    所以在 C++ 中,bool 是“只是一种整数”,即可以是 0 或 1。

    if(number) 测试数字是否非零。

    所以if ( a % b)if ( (a%b)!=0 )。当a 不是b 的整数倍时,a mod b 非零。

     int pages = sizes.at(i) / PAGE_SIZE;
     if ( sizes.at(i) % PAGE_SIZE ) pages++;
    

    那么,我们计算sizes.at(i) 除以PAGE_SIZE 然后向上取整。

    更干净的方法是

     int pages = (sizes.at(i)+PAGE_SIZE-1) / PAGE_SIZE;
    

    【讨论】:

      【解决方案3】:

      也许这会有所帮助

      size = 4, size/4 = 1, size%4 = 0, pages = 1
      size = 5, size/4 = 1, size%4 = 1, pages = 2
      size = 6, size/4 = 1, size%4 = 2, pages = 2
      size = 7, size/4 = 1, size%4 = 3, pages = 2
      size = 8, size/4 = 2, size%4 = 0, pages = 2
      

      比较第二列和第四列,当 size == 4 或 8 size/4 等于 pages。但是当大小等于 5、6 或 7 时,我们必须将 size/4 加 1 以得到 pages 的值。换句话说,有时我们需要加一,将 size/4 向上舍入为我们想要的页面值。我们必须四舍五入的那些行正是size%4 不等于零的那些行。这解释了这条线

      if ( sizes.at(i) % PAGE_SIZE ) pages++;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多