2011-06-12 13 views
8

¿C++ tiene algo así como List<> en C#? Algo como List<string> para almacenar una matriz de cadenas.¿Tiene C++ algo así como la lista <string> en C#?

+0

Tenga en cuenta que los "genéricos" se conocen generalmente como "plantillas" en C++. La biblioteca de plantillas estándar también proporciona varios contenedores además de listas, si alguna vez los necesita. –

+0

@Jeff: No. Su 'std :: list'. – Nawaz

+0

aunque hay 'std :: list ' es probable que desee usar 'std :: vector', o si es estático' std :: array' –

Respuesta

19

La respuesta es en realidad

std::vector<std::string> 

std::list es una lista enlazada, no como un conjunto List<T> clase C# 's.

E.g.

#include <iostream> // iostream is for cout and endl; not necessary just to use vector or string 
#include <vector> 
#include <string> 
using namespace std; 

int main() 
{ 
    vector<string> list; 
    list.push_back("foo"); 
    list.push_back("bar"); 
    for(vector<string>::const_iterator it = list.begin(); it != list.end(); ++it) 
     cout << *it << endl; 

    return 0; 
} 

La clase std::list es en realidad equivalente a LinkedList<T> clase C# 's.

+0

vector no está en vs, ¿qué encabezado debo usar? – Ata

+0

@Ata: '#include '? – Xeo

+0

Necesita '#include ' y '#include ' (para 'std :: string'). Además, necesita calificar explícitamente los tipos como 'std :: vector ' a menos que haga 'using namespace std;' en la parte superior de su archivo C++. – Sven

7

Una lista en .NET no es una lista vinculada. La estructura de datos que está buscando es una matriz redimensionable.

std::vector<std::string> list; 
0

C++ tiene std::vector clase de plantilla que corresponde a C# 's List. También tiene la plantilla std::list que corresponde a C# SingleLinkedList.

Uno debe estar preparado que en C++ vector y list llaman el constructor de la copia del artículo. Por lo tanto, para cada cadena que tenga una copia se creará.

lo tanto, si usted es limitado en la memoria o si desea almacenar las mismas cadenas en varias colecciones, es mejor utilizar std::vector<std::string*> o std::vector<char*> en lugar de std::vector<string>.

+0

'std :: list' es una lista doblemente enlazada, no una lista individualmente enlazada. – Xeo

+0

Claro, pero BCL no tiene una lista de doble enlace y STL no tiene un enlace único. Lo que quise decir es que las clases existentes son similares en términos de tiempo de inserción/eliminación garantizado. Gracias por la corrección. –

+2

No es aconsejable tener un contenedor de punteros ya que esto no es inherentemente una excepción. En la mayoría de las circunstancias, tal cosa no es necesaria de todos modos, y donde tal cosa podría ser necesaria, casi siempre hay mejores soluciones. –

Cuestiones relacionadas