由于声誉不足,我无法在主题上发表评论:
How to get position of a certain element in strings vector, to use it as an index in ints vector?
我想对这个答案有所了解:
关于线程的原始答案:
要在已知指向元素的迭代器的情况下获取向量中元素的位置,只需从迭代器中减去v.begin()
:
ptrdiff_t pos = find(Names.begin(), Names.end(), old_name_) - Names.begin();
现在,您需要对照pos
检查Names.size()
,以查看它是否超出范围:
if(pos >= Names.size()) {
//old_name_ not found
}
向量迭代器的行为类似于数组指针。您所了解的关于指针算法的大多数知识也可以应用于向量迭代器。
从C ++ 11开始,您可以使用std::distance
来代替迭代器和指针的减法:
ptrdiff_t pos = distance(Names.begin(), find(Names.begin(), Names.end(), old_name_));
问题:
我知道,我将两个迭代器传递给find方法,这似乎很合理:我传递了开始位置和结束位置。在这两者之间,我正在搜索该元素。 std :: find()返回满足作为第三个参数传递给std :: find()方法的值的第一个元素的迭代器。那么std :: distance除了在for循环中像计数器一样递增直到到达“端点”迭代器外没有做其他事情吗?
我也可以写:
int index = distance(Names.begin(), find(Names.begin(), Names.end(), old_name_));
为什么使用ptrdiff_t
比使用整数更好?有人在原始帖子中评论说,它使您可以将任意一对迭代器之间的距离存储到同一容器中,即使结果为负。但是我并没有真正理解这一点。也许您可以进一步解释。 (:
我来自C#,您可以在其中使用类似(在字符串上显示的)之类的东西:
string test = "Hello World";
int index = test.IndexOf("d");
与上面C ++中使用的方法相比,这似乎容易得多。 C ++中有等同的东西吗?
非常感谢您的帮助!
最诚挚的问候