如何更改C ++ STL向量的特定元素
vector<int> l; for(int i=1;i<=10;i++){ l.push_back(i); }
现在,例如, 如何将vector的5th element
更改为-1
?
我试过l.assign(4, -1);
这不像预期的那样。 没有其他的vector方法似乎适合。
我使用了vector,因为我需要在我的代码中使用随机访问function(使用l.at(i)
)。
at
和operator[]
都返回索引元素的引用,所以你可以简单地使用:
l.at(4) = -1;
要么
l[4] = -1;
这应该做到这一点:
l[4] = -1
尽pipe@JamesMcNellis的答案是一个有效的答案,我想解释一些关于error handling的事情,还有一个事实,就是有另一种做你想做的事情的方式。
您有三种方式访问vector中的特定项目:
- 使用
[]
运算符 - 使用
at(...)
的成员函数 - 将迭代器与给定的偏移量结合使用
在下面的例子中,我将使用以下载体作为实验鼠:
static const int arr[] = {1, 2, 3, 4}; std::vector<int> v(arr, arr+sizeof(arr)/sizeof(arr[0]));
这将创build一个向量,如下所示:
1 2 3 4
首先让我们看看做事的方式。 它的工作方式与使用普通数组时的工作方式基本相同。 你给一个索引, 可能你访问你想要的物品。 我说可能是因为[]
运算符不检查vector是否真的有这么多的项目。 这导致无记忆的无效存储器访问。 例:
v[10] = 9;
这可能会或可能不会导致即时崩溃。 最坏的情况当然是,如果它不,你实际上得到什么似乎是有效的价值。 与数组类似,这可能会导致浪费时间,试图找出例如1000行代码后,您得到的值为100
而不是234
,这有点连接到您从您的vector检索项目的位置。
更好的方法是使用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)
第三种方式与[]
运算符类似,可以将事情搞砸。 像数组一样的向量是一个包含相同types数据的连续内存块的序列。 这意味着你可以通过将它分配给一个迭代器来使用你的起始地址,然后给这个迭代器添加一个偏移量。 偏移量仅代表您想要遍历的第一个项目之后的项目数量:
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)
使用基本相同,但没有出界错误检查。
我build议尽可能使用at(...)
不仅仅是因为它比迭代器访问更具可读性,而且还因为错误检查了无效索引,所以上面提到的迭代器和偏移量组合都使用[]
运算符。
编辑:我忘了标准C ++库的algorithm
标题的std::for_each
。 这是我可以推荐的另一种方式(它在内部使用一个迭代器)。 你可以在这里阅读更多关于它的例子。
您可以使用下标运算符
l[4] = -1