迭代包含向量的集合,而不使用任何基于范围的循环或对向量的引用

Iterate a set containing vectors without using any range based loops or reference to a vector

本文关键字:向量 范围 引用 于范围 循环 集合 包含 迭代 任何基      更新时间:2023-10-16

假设我有一个包含n个不同大小的向量的集合。我想在不使用任何基于范围的循环的情况下迭代它们。我该怎么做!
例如,这有效,但我在这里使用了基于范围的循环

set < vector <int> > fset;
    for(auto it : fset)
        {
            for(auto itt : it)
            cout << itt << " ";
            cout << endl;
        }


这也有效,但我使用 i 作为矢量引用并迭代索引明智

set < vector <int> > fset;
for(set < vector <int> > :: iterator it=fset.begin();it!=fset.end();++it)
    {
        const vector < int >& i = (*it);
        int l = i.size();
        for(int j=0; j<l; ++j)
        cout << i[j] << " ";
        cout << endl;
    }


我想逐行显示集合中存在的所有矢量内容,但不使用上述任何方法。请帮帮我怎么做!谢谢!

需要 C++14(但也很容易转换为 C++11)

#include <iostream>
#include <ostream>
#include <iterator>
#include <set>
#include <vector>
int main() {
  std::set<std::vector<int>> svec = {
    {1,2,3},
    {4,5,6}
  };
  std::for_each(std::begin(svec), std::end(svec),
              [](const auto& vec) {
                  std::copy(std::begin(vec), std::end(vec),
                            std::ostream_iterator<int>(std::cout, " "));
                  std::cout << 'n';
              });
  return 0;
}

据我了解,这应该打印您的向量集:

set <vector <int> > data;
for (const auto& row : data)
{
  for (int value : row)
    cout << value << ", ";
  cout << "n";
}

您可以轻松调整内部循环中矢量元素之间的格式,以及内部循环之前或之后行首或行尾所需的任何内容。

使用迭代器:

for (auto row_it = data.begin(); row_it != data.end(); ++row_it)
{
  for (auto value_it = row_it->begin(); value_it != row_it->end(); ++value_it)
    cout << *value_it << ", ";
  cout << "n";
}

这两件事做完全相同的事情。ranged-for 仅通过添加类似

int value = *value_it;

在内部循环的开头。

希望这有帮助。

(哎呀。修正了拼写错误。


最终编辑
我猜如果你想避免auto,你会坚持使用较旧的C++编译器(C++98 或 C++03,这基本上是一回事)。

要正确命名迭代器,您需要考虑它们所表示的类型。这里不明显的一点是,只看代码,你不能修改集合的值。因此,所有内部迭代器都必须const

但是,由于您只打印集合本身,因此您不妨显式使用const迭代器作为外部循环。

for (set <vector <int> > ::const_iterator row_it = data.begin();  row_it != data.end();  ++row_it)
{
  for (vector <int> ::const_iterator value_it = row_it->begin();  value_it != row_it->end();  ++value_it)
    cout << *value_it << ", ";
  cout << "n";
}

希望有帮助。