矢量 - >使用成员函数begin()和end()vs运算符[]

时间:2009-07-20 09:01:15

标签: c++

使用向量时,为什么我们有时会使用operator []像homework [mid],但有时候使用homework.begin()。另外,homework.end()不是作业[结束],但这就像开始。它只是以不同方式访问元素吗?这种方式更令人困惑,你不同意吗?

4 个答案:

答案 0 :(得分:2)

vector :: operator []检索向量的第N个元素。这样的运算符仅为select STL容器类定义。

vector.end()是一个返回迭代器的方法。迭代器是用于处理STL容器的特殊实体,包括向量。 vector :: end()指向紧跟在向量的最后一个元素之后的元素 - 它通常被视为一个值来对比迭代器,以确定是否遍历了整个容器。

答案 1 :(得分:2)

这与C数组相同......

int [length_a]

“开始/结束”版本:

int* begin = a;
int* end = a+length_a;
while (p<e) {
   printf("%d", *p);
   ++p;
}

注意“end”如何指向数组之外的一个元素!它与vector :: end完全相同(将其视为停止条件)。

“[]”版本:

for (int i=0; i<length_a; ++i) {
   printf("%d", a[i]);
}

'[]'摘要:

  • +与C数组兼容,有效语法

  • - 不适用于非随机访问容器(例如:更改为“list”将很困难)

我的POV建议:

  • 使用[]进行随机访问或作为“简单”升级到c数组

  • 在顺序遍历整个内容时使用开始/结束

答案 2 :(得分:1)

begin()和end()是vector的成员函数,它返回一个迭代器。可以取消引用此迭代器以获取值。类似地,您有operator [],它接受索引并直接返回存储在该位置的值。

答案 3 :(得分:0)

他们做不同的事情。 operator[n]返回引用对n元素的引用。 begin()和end()返回指向容器开头和结尾的迭代器。如果你需要迭代容器,那么使用迭代器几乎不会“更加混乱”。它简单得多。

假设你有一个向量v:

std::vector<int> v;
v.push_back(1);
v.push_back(7);
v.push_back(42);
v.push_back(3);

如果您只想引用一个元素,您可以选择以下选项:

v[2];
*v.begin()+2;

所以在这里,operator[]更简单。 但是如果你想迭代容器,也许要打印出内容,你有以下选择:

for (int i = 0; i < v.size(); ++i){
  std::cout << v[i];
}

std::copy(v.begin(), v.end(), std::ostream_iterator<std::string>(std::cout));

突然间,迭代器为我们节省了大量的工作。我们不再需要制作循环。

或者说你想找到最大的元素:

int max = 0;
for (int i = 0; i < v.size(); ++i){
  if (v[i] > max) { max = v[i]; }
}

std::max_element(v.begin(), v.end());

或者您可能想要对矢量进行排序。我甚至不打算使用operator[]编写自己的排序算法,但这里是迭代器版本:

std::sort(v.begin(), v.end());

这就是为什么begin(),end()很有用。