【问题标题】:Assigning values in a vector in non-sequential order以非顺序顺序分配向量中的值
【发布时间】:2015-06-04 19:56:22
【问题描述】:

我想以最有效和最简单的方式使用向量实现类似于下面提到的代码。我该怎么做?

int a[1005];
for(int i=1;i<=1000;i+=5)
    a[i]=i*i;

当我尝试使用向量执行相同操作时,编译器会抛出 assertion failed error..subscript out of range...

vector<int> a;
for(int i=1;i<=1000;i+=5)
    a[i]=i*i;

所以,我尝试了 pushback 功能...但是向量的索引只能从 0 增加到对 pushback 的调用次数,而不是我想要的方式,即 1、6、11、16

vector<int> a;
for(int i=1;i<=1000;i+=5)
    a.pushback(i*i);

【问题讨论】:

  • vector.resize(sizeYouWant); 编辑vector&lt;int&gt; a(sizeYouWant);
  • compiler throws assertion failed error - 不,此异常发生在运行时
  • 真的很期待心灵感应编译器。如果程序按照我的意愿行事而不是按照我的吩咐去做,我会少说脏话。
  • 首先,您要解决什么问题(不提vector)?如果要能够使用允许您添加项目的数据结构,而不管价值如何并且没有大小问题,那么解决方案可能是使用std::map&lt;int,int&gt;,而不是vector&lt;int&gt;。如果您使用std::map&lt;int,int&gt;,您的代码将无需任何更改(从vector&lt;int&gt; 更改为std::map&lt;int, int&gt; 除外)。

标签: c++ c algorithm c++11 vector


【解决方案1】:

将所需大小的向量声明为构造函数参数:vector&lt;int&gt; a(1000);

【讨论】:

    【解决方案2】:

    到目前为止,我的答案会与其他人有所不同。

    如果目标是将数字存储在容器中,而不关心大小,或者关心数据是否连续存储,那么解决方案可能是使用std::map&lt;int, int&gt;

    例子:

    #include <map>
    #include <iostream>
    using namespace std;
    
    int main()
    {
        std::map<int, int> a;
        for(int i=1;i<=1000;i+=5)
            a[i]=i*i;
    
        // output the results  
        auto it = a.begin();
        while (it != a.end())
        {
             cout << it->first << " has a value of " << it->second << endl;
             ++it;
        }
    }
    

    实时示例:http://ideone.com/sfgfmu

    请注意,除了将vector 的声明更改为map 之外,您的原始代码没有任何更改。

    地图中的每个条目都有一个 i 项的键/值对作为键,其正方形作为数据。然后您可以使用地图的operator [],类似于将其用于数组的方式。但是,有一些不同之处在于,映射必须进行查找,而数组是直接访问的,如果项目不存在,映射将填充条目。

    就性能而言,地图必须以不同于数组的方式存储项目才能正常工作。因此,您很可能会在速度上略有下降,但不会很多(因为地图在对数时间内找到项目,而不是线性的)。

    因此,由您决定是坚持使用vector 并处理大小调整问题,还是使用std::map 并在可能降低速度的情况下享受便利(但如果有任何降级,可能不会很多,具体取决于您的使用情况)。

    【讨论】:

      【解决方案3】:

      你需要告诉vector有多少个元素。

      #include <vector>
      
      int main()
      {
          std::vector<int> a(1000); // 1000 elements
      
          for(int i = 0; i < 1000; i += 5)
              a[i] = i * i;
      }
      

      还要注意 arraysvectors0 而不是 1 开始。所以 1000 元素 arrayvector 算作 0 - 999(不是 1 - 1000)。

      【讨论】:

      • 这仍然会导致意外行为,因为 i 递增 5。因此,如果您从索引 1 开始,数组大小实际上将为 5001。而且 int 可能必须替换为 float 因为溢出。
      • @fsacer 我从0而不是1开始递增。而for() 主体只能在i &lt; 1000 时执行,所以它是安全的。现在也有许多计算机具有 32 位整数,如果这还不够,那么迁移到更大的 int 而不是浮点类型会更合适。
      • @fsacer: i 受测试限制i &lt; 1000;它不能超越这一点。无论如何,5001 肯定适合 int,因为 int 必须能够至少容纳 32767 以上的整数。
      • 我错过了条件。是的 long int 实际上更合适。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-13
      • 1970-01-01
      • 2018-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多