如何更改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) )。

atoperator[]都返回索引元素的引用,所以你可以简单地使用:

 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