【发布时间】:2011-12-30 20:08:46
【问题描述】:
假设我有一个 std::vector 并且我通过某种方式获得了第 n 个元素的地址。 给定我的 std::vector 的基地址,是否有一种简单的方法(比遍历向量更快)来获取元素出现的索引?假设我确定元素在向量中。
【问题讨论】:
假设我有一个 std::vector 并且我通过某种方式获得了第 n 个元素的地址。 给定我的 std::vector 的基地址,是否有一种简单的方法(比遍历向量更快)来获取元素出现的索引?假设我确定元素在向量中。
【问题讨论】:
距离(xxx.begin(), theIterator);
以上仅适用于vector::iterator。如果你只有一个指向元素的原始指针,你必须这样使用它:
距离(&v[0], theElementPtr);
【讨论】:
既然你知道元素在向量中,并且向量保证它的存储是连续的,你可以这样做:
index = element_pointer - vector.data();
或
index = element_pointer - &vector[0];
请注意,从技术上讲,连续保证是在 C++03 中引入的,但我还没有听说过 C++98 实现碰巧没有遵循它。
【讨论】:
std::vectors 和 C++11std::strings
vector<bool> 不是容器,它不满足概念。由于 C++11 vector<bool> 是一个常规的解压容器。
是的 - 因为向量保证所有元素都在一个连续的内存块中,你可以使用指针算法来找到它
#include <iostream>
#include <vector>
int main(int argc, char *argv[])
{
std::vector<int> vec;
for(int i=0; i<10; ++i)
{
vec.push_back(i);
}
int *ptr=&vec[5];
int *front=&vec[0];
std::cout << "Your index=" << ptr-front << std::endl;
return 0;
}
【讨论】:
在学习的路上,我做了以下笔记:
#include <iostream>
#include <vector>
int main() {
std::vector<std::string> words={"This","is","just","a","trial!"};
size_t i; //using the contiguous property of a vector:
for (auto const& elem : words) {
i = &elem - &*words.begin();// or
i = &elem - &words.front();// or
i = &elem - words.data();// or
i = std::addressof(elem) - std::addressof(words[0]);
if(std::addressof(elem) == &words.front())
std::cout << elem <<" (at"<<&elem<<") relative to ("<< &words[0] << ") takes position @#"<<i<< std::endl;
else std::cout << elem <<" (at"<<&elem<< ") takes position @#"<<i<< std::endl;
}
return 0;
}
试运行here。 有待进一步研究(或向大师学习)哪种方法是最安全/最安全和/或最有效的方法。
【讨论】: