Подтвердить что ты не робот

С++ вектор массива char

Я пытаюсь написать программу, которая имеет вектор массивов char, и у меня есть некоторые проблемы.

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

vector<char[]> v;

v.push_back(test);

Извините, это должен быть массив char, потому что мне нужно иметь возможность генерировать списки символов, поскольку я пытаюсь получить что-то вроде вывода.

a a a b a c a d a e b a b c

Может ли кто-нибудь указать мне в правильном направлении?

Спасибо

4b9b3361

Ответ 1

Вы не можете хранить массивы в векторах (или в любом другом контейнере стандартной библиотеки). То, что хранится в контейнерах стандартных библиотек, должно быть перераспределяемым и назначаемым, а массивы не являются ни тем, ни другим.

Если вам действительно нужно поместить массив в вектор (а вы, вероятно, нет - с помощью вектора векторов или вектора строк более вероятно, что вам нужно), то вы можете обернуть массив в struct:

struct S {
  char a[10];
};

а затем создайте вектор structs:

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

Ответ 2

Вам нужно

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

Если вы хотели создать вектор символа вместо вектора строк,

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

Выражение sizeof(test)/sizeof(*test) предназначено для вычисления количества элементов в тесте массива.

Ответ 3

Используйте std::string вместо char -arrays

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

Ответ 4

Вы можете использовать boost:: array, чтобы сделать это:

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

Edit:

Или вы можете использовать вектор векторов, как показано ниже:

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])));

Ответ 5

Вы можете напрямую определить вектор типа символа, как показано ниже.

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

Ответ 6

FFWD до 2019 года. Хотя этот кодекс работает и в 2011 году.

// g++ prog.cc -Wall -std=c++11
#include <iostream>
#include <vector>

 using namespace std;

 template<size_t N>
    inline 
      constexpr /* compile time */
      array<char,N> string_literal_to_array ( char const (&charrar)[N] )
 {
    return std::to_array( charrar) ;
 }

 template<size_t N>
    inline 
      /* run time */
      vector<char> string_literal_to_vector ( char const (&charrar)[N] )
 {
    return { charrar, charrar + N };
 }


int main()
{
   constexpr auto arr = string_literal_to_array("Compile Time");
   auto cv = string_literal_to_vector ("Run Time") ;
   return 42;
}

Совет: попробуйте оптимизировать использование std::string. Для буферизации символов std::array<char,N> самый быстрый, std::vector<char> быстрее.

https://wandbox.org/permlink/wcasstoY56MWbHqd

Ответ 7

Вы можете хранить массивы в векторах. Но в версии С++, которая появилась после 2011 года, массивы char скорее были бы строковыми типами данных. Но вы все равно можете это сделать:

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

Ответ 8

Что я обнаружил, так это то, что нормально помещать char * в std::vector:

//  1 - A std::vector of char*, more preper way is to use a std::vector<std::vector<char>> or std::vector<std::string>
std::vector<char*> v(10, "hi!");    //  You cannot put standard library containers e.g. char[] into std::vector!
for (auto& i : v)
{
    //std::cout << i << std::endl;
    i = "New";
}
for (auto i : v)
{
    std::cout << i << std::endl;
}