Как мне хранить массивы в списке STL?
17302 просмотра
6 ответа
393 Репутация автора
Используя C ++ и STL, кто-нибудь знает, как хранить целочисленные массивы как узлы в списке STL или векторе? У меня есть неизвестное количество пар чисел, которые мне нужно хранить, и, исходя из других языков, я сначала подумал о том, чтобы использовать какую-то структуру данных в виде списков или векторов ... но у меня возникли некоторые проблемы. Я на 100% уверен, что я делаю очевидную ошибку C ++ для новичка, и что кто-то, кто действительно знает язык, один раз посмотрит на то, что я пытаюсь сделать, и сможет уточнить меня.
Итак, вот что я попробовал. Объявление списка так работает:
stl::list<int[2]> my_list;
И тогда я легко могу создать массив из двух элементов, например:
int foo[2] = {1,2};
Это компилируется и работает просто отлично. Однако, как только я попытаюсь добавить foo
в свой список, вот так:
my_list.push_back(foo);
Я получаю целый грубый набор ошибок компилятора, ни одну из которых я действительно не понимаю (мой C ++ - fu почти отсутствует):
/usr/include/c++/4.0.0/ext/new_allocator.h: In member function ‘void __gnu_cxx::new_allocator<_Tp>::construct(_Tp*, const _Tp&) [with _Tp = int [2]]’:
/usr/include/c++/4.0.0/bits/stl_list.h:440: instantiated from ‘std::_List_node<_Tp>* std::list<_Tp, _Alloc>::_M_create_node(const _Tp&) [with _Tp = int [2], _Alloc = std::allocator<int [2]>]’
/usr/include/c++/4.0.0/bits/stl_list.h:1151: instantiated from ‘void std::list<_Tp, _Alloc>::_M_insert(std::_List_iterator<_Tp>, const _Tp&) [with _Tp = int [2], _Alloc = std::allocator<int [2]>]’
/usr/include/c++/4.0.0/bits/stl_list.h:773: instantiated from ‘void std::list<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = int [2], _Alloc = std::allocator<int [2]>]’
test.cpp:5: instantiated from here
/usr/include/c++/4.0.0/ext/new_allocator.h:104: error: ISO C++ forbids initialization in array new
Итак, у кого-нибудь есть идеи относительно того, что я здесь делаю неправильно? Любые указатели (без каламбура) будут наиболее полезными. Разве нельзя хранить массивы в std :: list? Должен ли я использовать структуру? Я просто скучаю по *
или &
где-то?
Ответы (6)
24 плюса
0 Репутация автора
Вещи, хранящиеся в контейнере стандартной библиотеки, должны быть назначаемыми и копируемыми - массивы не являются ни тем, ни другим. Лучше всего создать список std :: vector. Кроме того, вы можете обернуть массив в структуру:
struct A {
int array[2];
};
std::list <A> alist;
Автор: anon
Размещён: 05.05.2009 09:17
9 плюса
19757 Репутация автора
Вы не можете хранить массивы в контейнерах STL. Вы бы использовали вектор векторов или что-то подобное для общего случая. Для вашего конкретного случая, я хотел бы использовать вектор станд :: пары, например , так: std::vector<std::pair<int, int> >
. std::pair
это класс, который имеет два члена, first
и second
какого бы типа вы его ни называли.
Изменить: у меня изначально было как std::vector<std::pair<int> >
, но я не был уверен, был ли он перегружен, чтобы принять только 1 параметр в случае, если оба типа одинаковы ... небольшая копка не нашла доказательств этого, поэтому я изменил его на явно указать , что оба first
и second
являются int
s.
7 плюса
20293 Репутация автора
Это хорошая ситуация для использования boost :: array вместо "классических" массивов в стиле C. Это должно работать:
std::list<boost::array<int,2> > my_list;
boost::array<int,2> foo={{1,2}};
my_list.push_back(foo);
Автор: timday
Размещён: 05.05.2009 09:20
5 плюса
583 Репутация автора
Я бы предложил вам использовать std :: pair для хранения значений в этом случае. Он расположен в
<utility>
.
Вы можете хранить указатели на массивы в списке, но тогда вам придется иметь дело со всем управлением памятью. Использование пары намного проще, если вам нужны пары значений.
Автор: Samuel Otter Размещён: 05.05.2009 09:211 плюс
42693 Репутация автора
Начиная с C ++ 11, мы можем сделать это с помощью стандарта std::array
:
#include <array>
#include <list>
#include <iostream>
int main () {
std::list<std::array<int, 2>> l {{3,4},{5,6}};
l.push_back({1,2});
for (const auto &arr : l)
for (const auto &v : arr)
std::cout << v << ' ';
}
или же
l.push_back({{1,2}});
и т. д. чтобы заставить замолчать предупреждение
Выход:
3 4 5 6 1 2
Автор: Baum mit Augen
Размещён: 27.08.2017 11:26
1 плюс
29347 Репутация автора
В C ++ 11 доступна ::std::array
оболочка, которую можно использовать со стандартными контейнерами, например так:
#include <array>
#include <iostream>
#include <list>
#include <cstdint>
int
main()
{
using t_Buffer = ::std::array<::std::int32_t, 2>;
using t_Buffers = ::std::list<t_Buffer>;
t_Buffers buffers;
buffers.emplace_back(t_Buffer{1, 2});
::std::cout << buffers.front()[0] << " " << buffers.front()[1] << ::std::endl;
return(0);
}
Автор: VTT
Размещён: 27.08.2017 11:29
Вопросы из категории :
- c++ What are the barriers to understanding pointers and what can be done to overcome them?
- c++ Какой самый простой способ для анализа файла INI в C ++?
- c++ Когда вы должны использовать «друг» в C ++?
- c++ Как вы очищаете переменную stringstream?
- c++ В C ++ конструктор и деструктор могут быть встроенными функциями?
- c++ Что такое виртуальный базовый класс в C ++?
- arrays Как удалить дубликаты из массива C #?
- arrays Как определить размер моего массива в C?
- arrays Каков наилучший способ конвертировать массив в хеш в Ruby
- arrays Сравнение двухбайтовых массивов в .NET
- arrays Можно ли выполнять параллельные обходы в MATLAB так же, как в Python?
- arrays Haxe итерация на динамическом
- stl Зачем использовать итераторы вместо индексов массива?
- stl Инициализация статического std :: map <int, int> в C ++
- stl К STL или! STL, вот в чем вопрос
- stl Строка c_str () против данных ()
- stl Объединение двух стандартных: векторов
- stl Является ли list :: size () действительно O (n)?