我们可以将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_bound
returns一个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 == y
是 true
。 (参见:Compiler Explorer)
欢迎使用 Whosebug :)
首先,我们应该了解什么是迭代器。根据 hackingcpp
- objects that point to a location
- may point to a readable memory address / object
- ..
C++ STL中有很多容器,如vector
、list
、map
等
迭代器是指针的抽象,它允许您访问存储在容器中的元素,使用算法(例如sort
、find
、 lower_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=].
我刚接触 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_bound
returns一个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 == y
是 true
。 (参见:Compiler Explorer)
欢迎使用 Whosebug :)
首先,我们应该了解什么是迭代器。根据 hackingcpp
- objects that point to a location
- may point to a readable memory address / object
- ..
C++ STL中有很多容器,如vector
、list
、map
等
迭代器是指针的抽象,它允许您访问存储在容器中的元素,使用算法(例如sort
、find
、 lower_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=].