在一个向量中按非顺序赋值
Assigning values in a vector in non-sequential order
我想实现一个代码类似于下面提到的一个使用向量在最有效和最简单的方式。我该怎么做呢?
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
)。
相关文章:
- 为"adjacent"变量赋值时出现问题
- C++中的赋值发生,尽管右侧出现异常
- 用C++中的sscanf赋值
- 为std::string的某个索引赋值
- 重载Singly Linked List中的赋值运算符
- 为什么我必须在C++中添加一个赋值符号来声明一个数组
- gtest_使用setargpointee在函数中赋值
- 非常量变量只读位置的赋值
- 如何使C++编译器遵循与C#在该赋值语句中相同的优先级、关联性和求值顺序
- 在C++中,当表达式涉及对象时,将表达式赋值到对象中时,是否有定义的操作顺序?
- 双向循环列表中的赋值运算符以错误的顺序添加元素
- 初始化变量列表中的赋值顺序是否未定义
- 赋值子表达式的计算顺序
- 圆括号和赋值运算符顺序
- 赋值的顺序
- 赋值操作符中的c++函数求值顺序
- Shared_ptr赋值:引用计数顺序
- C++11:类初始化赋值顺序的主体
- 新的表达式求值顺序(指针赋值)
- 在一个向量中按非顺序赋值