如何更改C ++ STL向量的特定元素

时间:2010-04-12 18:05:11

标签: c++ stl vector

vector<int> l;
for(int i=1;i<=10;i++){
   l.push_back(i);
}

现在,例如,如何将向量的5th element更改为-1

我试过l.assign(4, -1); 它的行为不符合预期。其他任何矢量方法似乎都不合适。

我使用了vector,因为我需要在代码中使用随机访问功能(使用l.at(i))。

5 个答案:

答案 0 :(得分:98)

atoperator[]都返回对索引元素的引用,因此您只需使用:

l.at(4) = -1;

l[4] = -1;

答案 1 :(得分:10)

尽管@JamesMcNellis的答案是有效的,但我想解释一下有关错误处理的事情,以及还有另一种方法可以做你想做的事。

您可以通过四种方式访问​​向量中的特定项目:

  • 使用[]运算符
  • 使用成员函数at(...)
  • 将迭代器与给定的偏移量结合使用
  • 使用标准C ++库的std::for_each标头中的algorithm。这是我可以推荐的另一种方式(它在内部使用迭代器)。您可以阅读更多相关信息,例如here

在下面的例子中,我将使用以下载体作为实验室大鼠并解释前三种方法:

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)&gt; = this-&gt; 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(...),不仅因为它与迭代器访问相比更具可读性,而且因为我在上面提到的带有偏移量组合的迭代器和{{}的无效索引的错误检查1}} operator。

答案 2 :(得分:6)

这应该这样做:

l[4] = -1

答案 3 :(得分:5)

您可以使用subscript operator

l[4] = -1

答案 4 :(得分:1)

我更喜欢

l.at(4)= -1;

而[4]是你的指数