仅使用std :: pair的第一个值迭代向量

时间:2015-12-18 22:33:41

标签: c++ c++11 vector stl std-pair

我有一个std :: vector,如下所述:

std::vector<std::pair<int, const char*>> matrix;

此向量具有以下值(例如):values (as an example)

可以按如下方式访问这些值:

matrix[0] = [0,Hello] // pseudo code (only showing values inside)

matrix[1] = [0,Fox]  // pseudo code (only showing values inside)

matrix[2] = [1,Red]  // pseudo code (only showing values inside)

我正在遍历向量的内容读取值,通过这样做:

    for (std::vector<std::pair<int, const char*>>::iterator it = matrix.begin(); it != matrix.end(); ++it) 
    {
        std::pair<int, const char*> v_temp = *it;
        std::cout << v_temp.first;
        std::cout << v_temp.second;
    }

现在,这样做是从vector的第一个元素迭代到vector的end元素。我想要做的是,只迭代第一个元素(即int值)。因此,从我附加的表格图像中,此当前代码将循环[行x列] [9 x 2] = 18次。我希望它只迭代9次[行]而不考虑列。

我该怎么做?

3 个答案:

答案 0 :(得分:0)

你的循环迭代矩阵的行。 i的元素matrix是索引i处的“行”(在这种情况下是std::pair<int, const char*>。所以如果你推回了9对,那么循环将迭代9次

仅供参考:您可以使用C++ feature auto

简化代码
for(auto it = matrix.begin(); it != matrix.end(); ++it){
    auto v_temp = *it;
    std::cout << v_temp.first;
    std::cout << v_temp.second;
}

进一步简化

for(const auto& v_temp : matrix)
{
    std::cout << v_temp.first;
    // ...
}

您可以对编译器可以调用begin()end()的任何对象使用基于C ++ 11 for-range的循环。

答案 1 :(得分:0)

有很多方法可以为这只特殊的猫提供皮肤。一种是使用std::transform

std::transform(v.begin(), v.end(),
    std::ostream_iterator<int>(std::cout, "\t"),
    [](auto const &p) { return p.first; });

答案 2 :(得分:0)

TL; DR boost::transform_iterator是你的朋友。

摘自What is the equivalent of boost::make_transform_iterator in the standard library?的示例:

// I couldn't realize how to specialize type of std::get, so I need this helper.
inline int tuple_fst(const std::tuple<int, const char*> &x) {
  return x.first;
}
...
auto beg = boost::make_transform_iterator(matrix.begin(), tuple_fst);
auto end = boost::make_transform_iterator(matrix.end(), tuple_fst);
for (auto it = beg; it != end; ++it) {
    std::cout << *it;
}

这实际上是一个很好的问题,我不明白为什么这么低估。您想要像锈的std::iter::Map或Haskell的map之类的东西。不幸的是,如果需要高级迭代器功能,在C ++中事情会变得更加难看。