如何在字符串向量中获取某个元素的位置,以将其用作int向量中的索引? (=线程的原始名称)

时间:2019-01-16 14:14:59

标签: c++ iterator indexof

由于声誉不足,我无法在主题上发表评论:

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_));

问题:

  1. 这对编译器如何工作?后台会发生什么?

我知道,我将两个迭代器传递给find方法,这似乎很合理:我传递了开始位置和结束位置。在这两者之间,我正在搜索该元素。 std :: find()返回满足作为第三个参数传递给std :: find()方法的值的第一个元素的迭代器。那么std :: distance除了在for循环中像计数器一样递增直到到达“端点”迭代器外没有做其他事情吗?

  1. 我也可以写:

    int index = distance(Names.begin(), find(Names.begin(), Names.end(), old_name_));
    

为什么使用ptrdiff_t比使用整数更好?有人在原始帖子中评论说,它使您可以将任意一对迭代器之间的距离存储到同一容器中,即使结果为负。但是我并没有真正理解这一点。也许您可以进一步解释。 (:

  1. 我来自C#,您可以在其中使用类似(在字符串上显示的)之类的东西:

    string test = "Hello World";
    int index = test.IndexOf("d");
    

与上面C ++中使用的方法相比,这似乎容易得多。 C ++中有等同的东西吗?

非常感谢您的帮助!

最诚挚的问候

0 个答案:

没有答案