我有一个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次[行]而不考虑列。
我该怎么做?
答案 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 ++中事情会变得更加难看。