在一个向量中按非顺序赋值

Assigning values in a vector in non-sequential order

本文关键字:顺序 赋值 向量 一个      更新时间:2023-10-16

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

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

当我尝试使用向量做同样的事情时,编译器抛出断言失败错误…下标out of range

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

所以,我尝试了推回功能…然而,vector的索引只能从0增加到对pushback的调用次数,而不是我想要的方式,即1,6,11,16

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

将vector的大小声明为构造函数参数:vector<int> a(1000);

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

如果目标是在容器中存储数字,而不关心大小,或者关心数据是否连续存储,那么解决方案可能是使用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外,您的原始代码没有任何更改。

map中的每个条目都以i项的键/值对作为键,其平方作为数据。然后,您可以像使用数组一样使用映射的operator []。然而,两者的区别在于,map必须进行查找,而数组是直接访问,而且如果条目不存在,map将填充条目。

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

所以这取决于你是否坚持使用vector并处理大小调整问题,或者使用std::map并在可能的速度下降(但可能不会有很大的下降,取决于你的使用)的情况下生活。

你需要告诉向量应该有多少个元素。

#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)。