我们可以将lower_bound返回的迭代器的值作为向量索引吗?

Can we take the value of iterator which was returned from lower_bound as vector index?

我刚接触 C++ 中的向量,正在尝试了解它的工作原理。 首先,我有一个向量数组:

vector<int>container;

然后我想获取给定数字在向量数组中的位置。

vector<int>::iterator position;
    position = lower_bound(container.begin(), container.end(), temp);

之后,我想获取 lower_bound

返回的那个位置的值
container[position]

但我得到的错误是

No viable overloaded operator[] for type 'vector'

当我把它改成*(position+1)时,它工作正常。 那么这两者有什么区别呢?

std::lower_boundreturns一个ForwardIterator(参见:C++ named requirements: LegacyForwardIterator)。
您可以像指针一样取消引用它,例如:

std::vector<int> container;
// ...
auto it = std::lower_bound(container.begin(), container.end(), foo);
if (container.end() == it) { 
  throw or_something("handle error?");
}
const int x = *it;
const int y = container[std::distance(container.begin(), it)];

在那个例子中 x == ytrue。 (参见:Compiler Explorer

欢迎使用 Whosebug :)

首先,我们应该了解什么是迭代器。根据 hackingcpp

  • objects that point to a location
  • may point to a readable memory address / object
  • ..

C++ STL中有很多容器,如vectorlistmap

迭代器是指针的抽象,它允许您访问存储在容器中的元素,使用算法(例如sortfindlower_bound) 无论我们有什么样的容器,都由STL提供。

因此,std::lower_bound 的 return 类型是一个迭代器,如您所知 vector<int>::iterator,

您无法通过调用 container[position] 访问元素,vector 没有提供此功能 vector[iterator]

When I change it into *(position+1)

*itreator表示return迭代器指向的值。

顺便说一句,这样做很危险*(position+1)

因为给定值 tmp 可能在 vector 中,也许不在,所以您应该通过调用 vector 来检查给定值 tmp 是否在 vector 中=27=].