[英]How to change a particular element of a C++ STL vector
vector<int> l;
for(int i=1;i<=10;i++){
l.push_back(i);
}
现在,例如, 如何将向量的5th element
更改为-1
?
我试过l.assign(4, -1);
它的行为不符合预期。 其他矢量方法似乎都不合适。
我使用了矢量,因为我需要在我的代码中使用随机访问功能(使用l.at(i)
)。
at
和operator[]
都返回对索引元素的引用,因此您可以简单地使用:
l.at(4) = -1;
要么
l[4] = -1;
尽管@JamesMcNellis的答案是有效的,但我想解释一些关于错误处理的事情,以及还有另一种方法可以做你想做的事情。
您有四种方法可以访问向量中的特定项:
[]
运算符 at(...)
的成员函数 algorithm
头中的std::for_each
。 这是我可以推荐的另一种方式(它在内部使用迭代器)。 您可以在此处阅读有关它的更多信息。 在下面的例子中,我将使用以下载体作为实验室大鼠并解释前三种方法:
static const int arr[] = {1, 2, 3, 4};
std::vector<int> v(arr, arr+sizeof(arr)/sizeof(arr[0]));
这会创建一个向量,如下所示:
1 2 3 4
首先让我们来看看[]
的做事方式。 它的工作方式与使用普通数组时的预期方式大致相同。 您提供索引并可能访问所需的项目。 我说可能是因为[]
运算符不检查向量是否实际上有那么多项。 这导致无声的无效内存访问。 例:
v[10] = 9;
这可能会也可能不会导致即时崩溃。 最糟糕的情况当然是如果它没有,你实际上得到的似乎是一个有效的值。 与数组类似,这可能会导致浪费时间试图找到原因,例如1000行代码后来得到的值为100
而不是234
,这有点连接到从向量中检索项目的位置。
更好的方法是使用at(...)
。 这将自动检查out of bounds
行为并中断抛出std::out_of_range
。 所以在我们拥有的情况下
v.at(10) = 9;
我们将得到:
抛出'std :: out_of_range'实例后调用终止
what():vector :: _ M_range_check:__n(10)> = this-> size()(4)
第三种方式类似于[]
运算符,你可以搞砸了。 像数组一样的向量是包含相同类型数据的连续内存块序列。 这意味着您可以通过将起始地址分配给迭代器来使用起始地址,然后只需向此迭代器添加偏移量。 偏移量仅表示要遍历的第一个项目后的项目数:
std::vector<int>::iterator it = v.begin(); // First element of your vector
*(it+0) = 9; // offest = 0 basically means accessing v.begin()
// Now we have 9 2 3 4 instead of 1 2 3 4
*(it+1) = -1; // offset = 1 means first item of v plus an additional one
// Now we have 9 -1 3 4 instead of 9 2 3 4
// ...
如你所见,我们也可以做到
*(it+10) = 9;
这又是一个无效的内存访问。 这基本上与使用at(0 + offset)
但没有越界错误检查相同。
我建议尽可能使用at(...)
不仅因为它与迭代器访问相比更具可读性,而且因为我对上面提到的带偏移组合的迭代器和[]
运算符的无效索引进行了错误检查。
这应该这样做:
l[4] = -1
您可以使用下标运算符
l[4] = -1
我更喜欢
l.at(4)= -1;
而[4]是你的指数
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.