С++ вектор массива 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
Может ли кто-нибудь указать мне в правильном направлении?
Спасибо
Ответы
Ответ 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;
}