2010-03-06 14 views
20

Estoy tratando de escribir un programa que tiene un vector de matrices de caracteres y tengo algunos problemas.C++ vector de matriz de caracteres

char test [] = { 'a', 'b', 'c', 'd', 'e' }; 

vector<char[]> v; 

v.push_back(test); 

Lo sentimos, este tiene que ser una matriz de caracteres porque tengo que ser capaz de generar listas de caracteres como estoy tratando de obtener una salida algo similar.

a a a b c un un d un correo b a b c

Puede alguien me punto en la dirección correcta?

Gracias

+0

Olvide el vector y simplemente use std :: string. Luego puede usar + = para agregarle más caracteres. – Tronic

+0

No necesito solo agregar caracteres, necesito cambiar los caracteres antes y también el siguiente en la matriz. – aHunter

Respuesta

57

No puede almacenar matrices en vectores (o en cualquier otro contenedor de biblioteca estándar). Las cosas que los contenedores de biblioteca estándar almacenan deben ser copiables y asignables, y las matrices no son ninguna de estas.

Si realmente necesita poner una matriz en un vector (y probablemente no - usando un vector de vectores o un vector de cadenas es más probable que lo que necesita), entonces puede envolver la matriz en una estructura :

struct S { 
    char a[10]; 
}; 

y luego crear un vector de estructuras:

vector <S> v; 
S s; 
s.a[0] = 'x'; 
v.push_back(s); 
+2

¿Cómo se pueden copiar o asignar las matrices? – quantum231

11

Usted necesita

char test[] = "abcde"; // This will add a terminating \0 character to the array 
std::vector<std::string> v; 
v.push_back(test); 

de si nos referimos a hacer un vector de caracteres en lugar de un vector de cadenas,

std::vector<char> v(test, test + sizeof(test)/sizeof(*test)); 

La expresión sizeof(test)/sizeof(*test) es para calcular el número de elementos en la prueba de matriz.

+0

usando esto, ¿cómo podría push_back otra instancia de prueba agregarlo al vector existente? – aHunter

2

Use std::string en lugar de CHAR-arrays

std::string k ="abcde"; 
std::vector<std::string> v; 
v.push_back(k); 
+0

Si bien esto puede funcionar perfectamente para esta implementación, a mi entender la implementación de std :: string no garantiza tener almacenamiento de memoria contiguo. Si alguien debe usar esto para recibir transmisiones y usar esta solución, * puede ser * un problema. Además, si tiene un carácter 'NULL' en la transmisión, encontrará problemas con std :: string. – enthusiasticgeek

2

Puede utilizar boost::array de hacer eso:

boost::array<char, 5> test = {'a', 'b', 'c', 'd', 'e'}; 
std::vector<boost::array<char, 5> > v; 
v.push_back(test); 

Editar:

O puede usar un vector de vectores como se muestra a continuación:

char test[] = {'a', 'b', 'c', 'd', 'e'}; 
std::vector<std::vector<char> > v; 
v.push_back(std::vector<char>(test, test + sizeof(test)/ sizeof(test[0]))); 
-1

Se pueden almacenar con matrices de vectores .Pero en la versión de C++ que venía después de 2011, se suponía que las matrices de caracteres eran tipos de datos de cadena. Pero todavía puedes hacerlo por:

char test [] = { 'a', 'b', 'c', 'd', 'e' }; 
vector<char> v; 
for(int i=0;i<5;i++) 
v.push_back(test[i]); 
0

Puede definir directamente un vector de tipo char de la siguiente manera.

vector<char> c = {'a', 'b', 'c'}; 
vector < vector<char> > t = {{'a','a'}, 'b','b'};