Как напечатать vector <vector <int>> в с ++? [дубликат]
Я пытаюсь назначить и распечататьvector<vector<int>>
динамически, однако я не могу понять, как это сделать, я застрял здесь, это моя программа
#include<iostream>
#include<vector>
#include<string>
using namespace std;
class A {
public:
vector<int> getVector(int s) {
vector <int> A(s);
for (int j = 0; j < s; j++) {
A.push_back(j);
}
return A;
}
};
int main() {
A obj;
int n = 5;
vector<vector<int>> A;
A.push_back(obj.getVector(n)); // pushes a vector on vector A
A.push_back(obj.getVector(n - 1));
vector<vector<int>> ::iterator it;
it = A.begin();
for (it; it != A.end(); it++) {
cout << *it;
}
return 0;
}

5 ответов
vector<vector<int>> ::iterator it;
it = A.begin();
for (it; it != A.end(); it++) {
for(vector<int>::iterator it2 = it->begin(); it2 != it->end(); ++it2)
cout << *it2;
}
-
1Отлично, это то, что я искал! Теперь я понимаю это, в основном, мы должны инициализировать несколько итераторов в зависимости от того, сколько вложений у нас есть, спасибо :)
Рассматривайте vector <vector> как динамический 2D-массив.
Для этого вам потребуется 2 петли.
Также вам нужно изменить несколько вещей:
vector <int> A(s);
инициализирует вектор размераs
со всеми элементами, установленными на0
а затем вы нажимаете первыйn
элементы вA
. Итак, изменилосьvector <int> A(s);
кvector <int> A;
.using namespace std
не считается хорошей практикой. Узнай почему.
Взгляните на следующую реализацию:
#include<iostream>
#include<vector>
#include<string>
class A {
public:
std::vector<int> getVector(int s) {
std::vector <int> A; //Change 1
for (int j = 0; j < s; j++) {
A.push_back(j);
}
return A;
}
};
int main() {
A obj;
int n = 5;
std::vector<std::vector<int>> test_vector;
test_vector.push_back(obj.getVector(n)); // pushes a vector on vector A
test_vector.push_back(obj.getVector(n - 1));
std::vector<std::vector<int>> :: iterator test_vector_iterator;
test_vector_iterator = test_vector.begin();
for (test_vector_iterator; test_vector_iterator != test_vector.end(); test_vector_iterator++) {
std::vector<int> :: iterator inner_vector_iterator = (*test_vector_iterator).begin();
for(inner_vector_iterator; inner_vector_iterator != (*test_vector_iterator).end(); inner_vector_iterator++){
std::cout << *inner_vector_iterator <<" ";
}
std::cout << std::endl;
}
return 0;
}
Выход:
0 1 2 3 4
0 1 2 3
-
0Спасибо за подробное рассмотрение дальнейших проблем в моем коде :)
-
0Всегда! Пожалуйста, проголосуйте за ответ, если это помогло.
Используйте цикл диапазона, например
for( const auto &i : A ) // for elements in A, i is vector<int>
{
for( const auto &j : i ) // for sub elements in A, j is int
{
std::cout<<j;
}
}
или используя итератор
for( vector<vector<int>>::iterator i = A.begin() ; i != A.end(); i++ )
{
for( vector<int>::iterator j = i->begin(); j != i->end(); j++ )
{
std::cout<<*j;
}
}
Спасибо.
-
2Скорее всего, это больше сбивает с толку ОП, чем помогает. Они уже правильно поняли итераторы, и теперь вы представляете им совершенно новую концепцию без каких-либо дополнительных объяснений.
-
1согласованные итераторы пока хороши, и первый метод немного сбивает с толку, однако он обновил решение, написанное обоими способами, поэтому я думаю, что он заслуживает +1 :)
Вложенный std :: for_each может помочь
Applies the given function object f to the result of dereferencing every iterator in the range [first, last), in order.
Мы сделаемf
братьstd::vector<int>
в качестве аргумента и распечатайте его.
#include <iostream>
#include <vector>
#include <algorithm>
int main()
{
std::vector<std::vector<int>> A{ {1,2}, {3, 4} };
std::for_each(A.begin(), A.end(), [](const auto& v) {
std::for_each(v.begin(), v.end(), [](auto const& it) {
std::cout << it << std::endl;
});
});
return 0;
}
Выход
1
2
3
4
Вектор векторов является аналогом 2-го массива. Стандартного метода сериализации вектора нет, подойдет вложенный цикл.
#include<iostream>
#include<vector>
#include<string>
#include <algorithm>
using std::for_each;
using std::cout;
using std::vector;
using std::endl;
class A {
public:
vector<int> getVector(int s) {
vector <int> A(s);
for (int j = 0; j < s; j++) {
A.push_back(j);
}
return A;
}
};
int main() {
A obj;
int n = 5;
vector<vector<int>> A;
A.push_back(obj.getVector(n)); // pushes a vector on vector A
A.push_back(obj.getVector(n - 1));
// classic for loop
for (auto itV = A.begin(), itVE = A.end(); itV != itVE; itV++)
{
for (auto itI = itV->begin(), itIE = itV->end(); itI != itIE; itI++)
{
cout << *itI;
}
}
cout << endl;
// much simpler range-based loop
for (auto& rowV : A ) // note that this a reference
// - no copy of stored vector is made.
for (auto el : rowV)
cout << el;
cout << endl;
// a generic lambda to serialize vector
auto print_vector = [](const auto& v) {
std::for_each(v.begin(), v.end(), [](auto const& it) {
std::cout << it << std::endl;
});
};
std::for_each(A.begin(), A.end(), print_vector );
return 0;
}
Есть несколько способов сделать это: использовать классический for (), который довольно полон, но позволяет контролировать некоторые аспекты, цикл for на основе диапазона является самым коротким и кратким вариантом. Третий подход - использование идиоматической функции из стандартной библиотеки, напримерfor_each
, что потребует создания вызываемого объекта, что может быть предпочтительным, если вызываемый объект может использоваться повторно или быть заменен чем-то другим, что обеспечивает некоторую гибкость.
-
0Не подходящее использование for_each
-
0@ lajoh90686 прости?
Другие вопросы
- Почему универсальная ссылка должна использовать шаблон для функции-члена вместо класса?2 ответ
Например: Это НЕ универсальная ссылка:template<typename T> class C { public: void gogo(T&& c); }; Но это:template<typename A> class C { public: template<typename B> void gogo(B&& par); }
- Почему я получаю сообщение об ошибке: ожидаемое первичное выражение перед bool?3 ответ
#include<iostream> #include<string> using namespace std; class LFSR { private: bool lfsr[]; private: int tap; private: int t; private: string s; public: LFSR(string seed, int tap) { s = seed; t = tap; lfsr = bool[s.length()]; ...
- Как исправить "Программа завершена сигналом SIGFPE"1 ответ
Вопрос в том :- Учитывая целое число, для каждой цифры, составляющей целое число, определите, является ли оно делителем. Подсчитайте количество делителей, входящих в целое число. ЗавершитьfindDigits в редакторе ниже.findDigits имеет следующие параметры: int n: значение для анализаint findDigits(int ...
- Как сохранить в списке символ "пробел" [закрыто]1 ответ
Закрыто. Этот вопрос требует подробностей отладки . В настоящее время он не принимает ответы. Хотите улучшить этот вопрос? Обновите вопрос, чтобы он соответствовал теме Stack Overflow. Закрыт 5 месяцев назад . Уточните этот вопрос Я объявил этот векторvector<char> germat{ SekuencaEfjaleve.be...
- Ошибка сегментации Ошибка вектора в C ++ [закрыто]1 ответ
Закрыто. Этот вопрос требует подробностей отладки . В настоящее время он не принимает ответы. Хотите улучшить этот вопрос? Обновите вопрос, чтобы он соответствовал теме Stack Overflow. Закрыт 10 месяцев назад . Уточните этот вопрос Какая ошибка в следующей программе? Программа предназначена для по...
- увеличить отчет о 1,73 сообщения во время сборки проекта1 ответ
Я использую Boost 1.73 в старом проекте, который использовал Boost 1.48. Я намерен исправлять все предупреждения и ошибки в процессе. При компиляции проекта я получаю некоторые странные сообщения, которые находятся не в исходном коде проекта, а в самом ускорении, эти сообщения похожи на большинство ...
- выполнение глубокого копирования вектора указателей в конструкторе копирования изменило оба члена вектора?1 ответ
мне нужна глубокая копия в моем проекте, и сейчас яmemcpy вsrcObj вdestObj тогда еслиdestObj владеет членами-указателями, я просто создаю все объекты и рекурсивно выполняю этот метод вот псевдо:class B { public: B(int id_) : id(id_) {}; int id = 0; }; class A { public: vector<B*> ...
- std :: vector пар <key-value> с разными типами1 ответ
Я пытаюсь создать небольшую функцию интерфейса и отправить ее в класс форматирования JSON. JSON работает только с (неограниченными) парами ключ-значение, но значение может быть (только):string, int, bool Теперь у меня есть:struct Data { std::vector<std::pair<std::string, int64_t>>...
- Как избежать такого повторения кода?1 ответ
Чтобы избежать повторения кода, мне нужно сделать что-то вроде этого (в моем реальном коде у меня есть гораздо более сложные типы, похожие наT1 а такжеT2 ):template <class T1, class T2> struct A {}; template <class T1, class T2> struct B {}; template <class X> struct C { us...
- C ++: будет ли пропущено какое-либо исключение с помощью catch (…) [дубликат]2 ответ
На этот вопрос уже есть ответы здесь : C ++ перехватывает все исключения (16 ответов) Закрыт 8 месяцев назад . Делаетcatch(...) поймать все исключения или будет какое-то исключение, которое может быть пропущено этим?

"Завидую тестировщикам: все хотят с ними дружить."
std::vector<int>
не имеет определенного оператора вывода дляstd::ostream
. Так что просто вложите еще один цикл for в тот, который у вас уже есть. πάντα ῥεῖvector <int> A(s)
наvector <int> A
иначе, скажем, для n = 5 он создаст вектор длины 5, инициализированный с помощью{0, 0, 0, 0, 0}
и снова нажмите{0, 1, 2, 3, 4}
и, наконец, приведет к{0, 0, 0, 0, 0, 0, 1, 2, 3, 4}
hafiz031*it
в основном вектор, посколькуit
является итератором вектора. Это простой подход: сохраните этот вектор вvector<int>
напримерvector<int> v = *it
а затем распечатайтеv
с помощью цикла. hafiz031