C++ 仅使用std::pair的第一个值在向量上迭代

C++ 仅使用std::pair的第一个值在向量上迭代,c++,c++11,vector,stl,std-pair,C++,C++11,Vector,Stl,Std Pair,我有一个std::vector,如下所述: std::vector<std::pair<int, const char*>> matrix; 通过执行以下操作,我将遍历向量的内容并读取值: for (std::vector<std::pair<int, const char*>>::iterator it = matrix.begin(); it != matrix.end(); ++it) { std::pai

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

std::vector<std::pair<int, const char*>> matrix;
通过执行以下操作,我将遍历向量的内容并读取值:

    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;
    }
现在,它所做的是从向量的第一个元素迭代到向量的最后一个元素。我想做的是只迭代第一个元素,即int值。因此,从我所附的表格图像来看,当前代码将循环[row x column][9 x 2]=18次。我希望它只迭代9次[行]而不考虑列。


我如何才能做到这一点?

您的循环在矩阵的行上进行迭代。元素iof matrix是索引i处的行,在本例中为std::pair。因此,如果你已经向后推了9对,那么循环将迭代9次

仅供参考:您可以使用自动:

需要进一步简化

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

对于编译器可以调用begin和end on的任何对象,都可以使用C++11 for range-based循环。

有很多方法可以对这只特定的猫进行蒙皮。一种是使用std::transform:

TL;变换迭代器是你的朋友

示例取自:


这其实是一个很好的问题,我不明白为什么会被否决。你想要像rust's std::iter::Map或Haskell's Map这样的东西。不幸的是,在C++中,如果你想要高级迭代器函数,事情会变得更丑。

你是否尝试过删除STD::CUT?你可能想学习如何使用一些工具来理解程序的控制流,你可以用Auto& VyTeMp简化:矩阵{…}凯文确实如此!我会在答案后面加上这个。
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;
    // ...
}
std::transform(v.begin(), v.end(),
    std::ostream_iterator<int>(std::cout, "\t"),
    [](auto const &p) { return p.first; });
// 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;
}