以非顺序顺序在矢量中分配值

时间:2015-06-04 19:56:22

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

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

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

当我尝试使用向量执行相同操作时,编译器会抛出断言失败错误..subscript超出范围 ...

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

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

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

3 个答案:

答案 0 :(得分:4)

将具有所需大小的向量声明为构造函数参数:vector<int> a(1000);

答案 1 :(得分:2)

到目前为止,我的回答将与其他人的回答略有不同。

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

示例:

#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并且方便地使用可能会降低速度(但可能不是很多,如果有任何退化,取决于您的用途)。

答案 2 :(得分:0)

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

#include <vector>

int main()
{
    std::vector<int> a(1000); // 1000 elements

    for(int i = 0; i < 1000; i += 5)
        a[i] = i * i;
}

另请注意,数组向量0而不是1开始。因此,1000元素数组向量的格式为0 - 999(不是1 - 1000)。