2013-07-27 3 views
1

я не могу найти человека объяснений этого: как я могу создать массив списков какмассив станд :: список с

std::list<int> mylist[size] ? 

Если бы это в моей программе он компилирует, но создает некоторые проблемы, так как он не выполняет какой-либо код (остальная часть кода работает просто отлично, если я пишу mylist w/out [size])

Я где-то читал, что использование примитивных массивов C не рекомендуется; Какие альтернативы?

Спасибо пардон за newbness

+10

«Я не могу найти ни одного человеческого объяснения *» - я попрошу, чтобы моя черепаха опубликовала ответ: D – Maroun

+1

@MarounMaroun lol, я ваша черепаха – P0W

+0

Можете ли вы привести пример того, как вы его используете? ? –

ответ

4

Ваше объявление неверно и не поддерживается на C++. Вы пытаетесь объявить массив с переменным размером во время выполнения, который является функцией C99, но не находится на C++. Смотрите здесь: Array size at run time without dynamic allocation is allowed?

У вас есть это:

std::list<int> mylist[size] 

Что вам нужно это:

std::list<int> mylist[] = new std::list<int>[size]; 

Но это еще плохая идея, так как вам нужно отменить передать его позже delete []. Как уже говорили другие, вы можете сделать это несколько различных способов, которые все лучше C++:

std::list< std::list<int> > myListOfLists;  // Linked list of linked lists 
std::vector< std::list<int> > myVectorOfLists; // Better, a vector is more like an array 
std::array<std::list<int>, 10> this_would_do;  // From above, only works if you know the array size at compile-time 

Я надеюсь, что это помогает и ясно для вас.

+0

Я нахожу 'std :: list mylist [] = new std :: list [size];' вызывает ошибку на моей машине MAC. Однако, 'std :: list * mylist = new std :: list [size];' работает плавно. – TuanDT

+1

Это может быть правдой. Часто указатель или пустой массив в типе переменной одинаковый (зависит от компилятора), но, очевидно, не всегда, и указатель, вероятно, более ясен относительно того, что на самом деле происходит в стеке. В любом случае, я бы рекомендовал использовать одно из трех предложений в конце (в зависимости от потребностей), а не то, о чем просил OP, поскольку это больше C++ - ish. Если мне была предоставлена ​​общая проблема «Мне нужен массив связанных списков, которые я знаю только во время выполнения», я бы использовал форму 'std :: vector > ', если только там была еще одна причина. –

5

Более конкретно,

#include <array> 
#include <list> 

int main() { 
    std::array<std::list<int>, 10> this_would_do; 
} 
2
//Codes        // | Being Human 
typedef list<int> L;     // | L is now "alias" for list of integers 
const int arr_size=100;    // | array needs a constant size, list don't 
array<L,arr_size> myArrayOfList;  // | An Array as elements L 
list<L> myListOfList;    // | A List of elements L 

//A STL list is doubly linked list 
0

Если вы на самом деле имеют фиксированный размер (например, у Вас есть списки вещей, которые были даны в «оценка» от 0 -9), то, используя массив фиксированного размера прекрасно:

std::list<item> scored_items[10]; 

конечно, это плохая идея, если вы не знаете, заранее, сколько вы действительно хотите. Тогда подходящими могут быть либо std::list < std::list <item> > myLists;, либо вектор std::vector < std::list < item> my_lists;.

«Правильное» решение зависит от вашей конечной цели.

0

Vector может быть хорошей альтернативой для массива C:

#include <vector> 
... 
std::vector<std::list<int> > vectorOfLists; 
0

Синтаксис, чтобы объявить список выглядит следующим образом

std::list<T> my_list; 

Т представляет собой заполнитель для любого типа, в том числе другой список, так вы можете заменить Т std::list<int>, который дает следующее:

std::list<std::list<int>> my_list; 

Это объявление списка, который может содержать списки, в которых могут храниться целые числа. Обратите внимание, что некоторые компиляторы могут жаловаться на >>, в этом случае изменить его на > >

+0

,' std :: vector' были бы более уместными. Даже известный в OPs случай 'std :: vector ' над 'std :: list ' имел бы, вероятно, * было бы лучше, в первую очередь. –