std :: distance()如何工作?

时间:2017-04-27 06:04:11

标签: c++11 vector stl

我非常擅长C ++ 11并了解STL库。我写了一个像这样的代码,

#include <bits/stdc++.h>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;

void Print( const vector<int> &arrays )
{
   for ( int x : arrays ) cout << x << ' ';
}

int main() {
    int citys, cityPairs, fv, lv, w;
    vector <int> fvarr;
    vector <int> lvarr;
    vector <int> warr;
  vector <int> warr_temp;
  vector <int> disjoint_pairs;

    scanf("%d%d", &citys, &cityPairs);

    for(int nr = 0; nr < cityPairs; nr++){
        scanf("%d%d%d", &fv, &lv, &w);
        fvarr.push_back(fv);
        lvarr.push_back(lv);
        warr.push_back(w);
      warr_temp = warr;
    }

  for (int j = 0; j < citys; j++){
    auto result = min_element(begin(warr_temp), end(warr_temp));
    auto pos_temp = distance(begin(warr_temp), result);
    cout << pos_temp;
    auto pos = distance(begin(warr), result);
    cout << pos;
    disjoint_pairs.push_back(fvarr[pos]);
    disjoint_pairs.push_back(lvarr[pos]);
    warr_temp.erase(warr_temp.begin() + pos_temp);
  }
  // Print(disjoint_pairs);
}

我在这段代码中正在做的是我正在使用3个向量和1个向量来复制最后一个warr_temp = warr;。然后我检查向量warr_temp中的最小值并将其索引存储在pos_temp中,然后我将该值的最小值索引从向量warr存储到pos

现在问题是第一个cout pos_temp给了我正确的值,但第二个是pos给我这样的输出,

-61-62-63-64

为什么会这样?这些数字是多少?他们是指针吗?我知道距离是一个模板,所以实现这个的正确方法是什么?

如果有人能够清除我的怀疑那将是非常有帮助的。 对不起愚蠢的问题!!!

1 个答案:

答案 0 :(得分:1)

问题的根本原因是auto pos = distance(begin(warr), result);行。它会产生不可预测的结果,因为resultbegin(warr)属于不同的向量。

result是指向warr_temp元素的迭代器,它不能与指向warr元素的begin(warr)元素的迭代器混合。

要在warr向量中获取元素位置,请改为使用std::find(begin(warr), end(warr), *result)

auto warr_res = std::find(begin(warr), end(warr), *result);
auto pos = distance(begin(warr), warr_res);