Как объявить массив строк в C++?
Я пытаюсь перебрать все элементы статического массива строк в лучшем виде. Я хочу иметь возможность объявить его на одной строке и легко добавлять/удалять элементы из него без необходимости отслеживать номер. Звучит просто, не так ли?
возможных решений:
vector<string> v;
v.push_back("abc");
b.push_back("xyz");
for(int i = 0; i < v.size(); i++)
cout << v[i] << endl;
проблемы - невозможно создать вектор на одной строке со списком строк
возможно, решение 2:
string list[] = {"abc", "xyz"};
проблемы - нет способ получить количество строк автоматически (что я знаю).
там должен быть простой способ сделать это.
15 ответов:
The boost назначить библиотеку Кажется, именно то, что вы ищете. Это делает назначение констант контейнерам проще, чем когда-либо.
в C++ 11 добавили списки инициализации, чтобы разрешить следующий синтаксис:
std::vector<std::string> v = {"Hello", "World"};поддержка этой функции C++ 11 была добавлена по крайней мере GCC 4.4 и только в Visual Studio 2013.
вы можете кратко инициализировать a
vector<string>из статически созданногоchar*время:char* strarray[] = {"hey", "sup", "dogg"}; vector<string> strvector(strarray, strarray + 3);это копирует все строки, кстати, так что вы используете в два раза больше памяти. Вы можете использовать предложение Уилла Дина, чтобы заменить магическое число 3 здесь arraysize(str_array) - хотя я помню, что есть какой-то особый случай, в котором эта конкретная версия arraysize может сделать что-то плохое (извините, я не могу сразу вспомнить детали). Но это очень часто работает правильно.
кроме того, если вы действительно увлечены одной строкой, вы можете определить вариативный макрос, чтобы одна строка, такая как
DEFINE_STR_VEC(strvector, "hi", "there", "everyone");строительство.
проблемы - не способ получить количество строк автоматически (что я знаю).
существует стандартный способ сделать это, который многие люди (включая MS) определяют макросы, такие как
arraysizeдля:#define arraysize(ar) (sizeof(ar) / sizeof(ar[0]))
объявите массив строк в C++ следующим образом:
char array_of_strings[][]например :
char array_of_strings[200][8192];будет содержать 200 строк, каждая строка имеет размер 8kb или 8192 байт.
использовать
strcpy(line[i],tempBuffer);поместить данные в массив строк.
одна возможность заключается в использовании нулевого указателя в качестве значения флага:
const char *list[] = {"dog", "cat", NULL}; for (char **iList = list; *iList != NULL; ++iList) { cout << *iList; }
можно использовать
beginиendфункции из библиотеки диапазона повышения, чтобы легко найти концы примитивного массива, и в отличие от решения макроса, это даст ошибку компиляции вместо нарушенного поведения, если вы случайно примените его к указателю.const char* array[] = { "cat", "dog", "horse" }; vector<string> vec(begin(array), end(array));
вы можете использовать предложение Дина [
#define arraysize(ar) (sizeof(ar) / sizeof(ar[0]))] чтобы заменить магическое число 3 здесь arraysize (str_array) - хотя я помню, что есть какой-то особый случай, в котором эта конкретная версия arraysize может сделать что-то плохое (извините, я не могу сразу вспомнить детали). Но это очень часто работает правильно.случай, когда он не работает, когда "массив" на самом деле просто указатель, а не фактический массив. Кроме того, из-за того, как массивы передаваемые функции (преобразован в указатель на первый элемент), он не работает через вызовы функций, даже если подпись выглядит как массив -
some_function(string parameter[])действительноsome_function(string *parameter).
попытался повысить ответ Крейга H, что вы должны использовать boost:: assign, но у меня нет rep : (
Я столкнулся с подобной техникой в первой статье, которую я когда-либо читал Андрея Александреску в Журнал Пользователей C / C++, Vol 16, No 9, September 1998, PP. 73-74 (имейте полную цитату, потому что это в комментариях моей реализации его кода, который я использую с тех пор).
Шаблоны-это ваш друг.
вместо этого макроса, могу ли я предложить этот:
template<typename T, int N> inline size_t array_size(T(&)[N]) { return N; } #define ARRAY_SIZE(X) (sizeof(array_size(X)) ? (sizeof(X) / sizeof((X)[0])) : -1)1) мы хотим использовать макрос, чтобы сделать его константой времени компиляции; результат вызова функции не является константой времени компиляции.
2) однако мы не хотим использовать макрос, потому что макрос может быть случайно использован на указателе. Функция может использоваться только для массивов времени компиляции.
Итак, мы используем определенность функции, чтобы сделать макрос "безопасным"; если функция существует (т. е. она имеет ненулевой размер), то мы используем макрос, как указано выше. Если функция не существует, мы возвращаем плохое значение.
#include <boost/foreach.hpp> const char* list[] = {"abc", "xyz"}; BOOST_FOREACH(const char* str, list) { cout << str << endl; }
вот пример:
#include <iostream> #include <string> #include <vector> #include <iterator> int main() { const char* const list[] = {"zip", "zam", "bam"}; const size_t len = sizeof(list) / sizeof(list[0]); for (size_t i = 0; i < len; ++i) std::cout << list[i] << "\n"; const std::vector<string> v(list, list + len); std::copy(v.begin(), v.end(), std::ostream_iterator<string>(std::cout, "\n")); }
#include <iostream> #include <string> #include <vector> #include <boost/assign/list_of.hpp> int main() { const std::vector< std::string > v = boost::assign::list_of( "abc" )( "xyz" ); std::copy( v.begin(), v.end(), std::ostream_iterator< std::string >( std::cout, "\n" ) ); }
#include <iostream.h> #include <iomanip.h> int main() { int n; cout<<"enter the maximum number\n"; cin>>n; cout<<"enter the first number\n"; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { cin>>a[i][j]; } } cout<<"enter the second number\n"; for(int i=0;i<n;i++) { for(int k=0;k<n;k++) { cin>>b[i][k]; } } cout<<"the product will be\n"; for(int i=0;i<n;i++) { for(int g=0;g<n;g++) { c[i][g]=c[i][c]*c[i][j]; cout<<setw(5)<<c[i][g]; } cout<<endl; } return 0; }
вы можете напрямую объявить массив строк, таких как
string s[100];. Затем, если вы хотите получить доступ к определенным элементам, вы можете получить его напрямую, какs[2][90]. Для целей итерации, возьмите размер строки с помощью
Comments