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

Как объявить массив строк в С++?

Я пытаюсь перебрать все элементы статического массива строк наилучшим образом. Я хочу, чтобы иметь возможность объявить его на одной строке и легко добавлять/удалять элементы из него, не отслеживая число. Звучит очень просто, не так ли?

Возможные нерешения:

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"};

Проблемы - нет возможности автоматически получить количество строк (что я знаю).

Должен быть простой способ сделать это.

4b9b3361

Ответ 2

С++ 11 добавлены списки инициализации, чтобы разрешить следующий синтаксис:

std::vector<std::string> v = {"Hello", "World"};

Поддержка этой функции С++ 11 была добавлена ​​как минимум GCC 4.4 и только в Visual Studio 2013.

Ответ 3

Вы можете кратко инициализировать 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");.

Ответ 4

Проблемы - нет возможности автоматически получить число строк (что я знаю).

Существует стандартный способ выполнения ботов, который многие люди (включая MS) определяют макросы типа arraysize для:

#define arraysize(ar)  (sizeof(ar) / sizeof(ar[0]))

Ответ 5

Объявите массив строк в С++ следующим образом: char array_of_strings[][]

Например: char array_of_strings[200][8192];

будет содержать 200 строк, каждая строка которых имеет размер 8kb или 8192 байта.

используйте strcpy(line[i],tempBuffer); для размещения данных в массиве строк.

Ответ 6

Одна возможность - использовать указатель NULL в качестве значения флага:

const char *list[] = {"dog", "cat", NULL};
for (char **iList = list; *iList != NULL; ++iList)
{
    cout << *iList;
}

Ответ 7

Вы можете использовать функции begin и end из библиотеки диапазонов Boost, чтобы легко находить концы примитивного массива, и в отличие от решения макросов это приведет к ошибке компиляции вместо нарушения поведения, если вы случайно примените это указатель.

const char* array[] = { "cat", "dog", "horse" };
vector<string> vec(begin(array), end(array));

Ответ 8

Вы можете использовать предложение Will Dean [ #define arraysize(ar) (sizeof(ar) / sizeof(ar[0]))], чтобы заменить магическое число 3 здесь на arraysize (str_array) - хотя я помню, что есть какой-то особый случай, когда эта конкретная версия arraysize может сделать что-то плохое (извините, я не может сразу запомнить данные). Но он очень часто работает правильно.

Случай, когда он не работает, - это когда "массив" - это просто указатель, а не фактический массив. Кроме того, из-за того, как массивы передаются в функции (преобразуются в указатель на первый элемент), он не работает через вызовы функций, даже если подпись выглядит как массив — some_function(string parameter[]) действительно some_function(string *parameter).

Ответ 9

Пытался перевернуть Craig H ответить, что вы должны использовать boost:: assign, но у меня нет rep: (

Я столкнулся с подобной техникой в ​​первой статье, которую я когда-либо читал Андреем Александреску в журнале C/С++ Users Journal, том 16, № 9, сентябрь 1998 г., стр. 73-74 (есть полная цитата, потому что она в комментариях моя реализация его кода, который я использовал с тех пор).

Шаблоны - ваш друг.

Ответ 10

Вот пример:

#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"));
}

Ответ 11

Вместо этого макроса я могу предложить следующее:

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) Однако мы не хотим использовать макрос, потому что макрос может быть случайно использован на указателе. Функция может использоваться только для массивов времени компиляции.

Итак, мы используем определенную функцию, чтобы сделать макрос "безопасным"; если функция существует (т.е. имеет ненулевой размер), то мы используем макрос, как указано выше. Если функция не существует, мы возвращаем плохую величину.

Ответ 12

#include <boost/foreach.hpp>

const char* list[] = {"abc", "xyz"};
BOOST_FOREACH(const char* str, list)
{
    cout << str << endl;
}

Ответ 13

#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" ) );
}

Ответ 14

#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;
}

Ответ 15

Вы можете напрямую объявить массив строк, например string s[100];. Затем, если вы хотите получить доступ к определенным элементам, вы можете получить его прямо как s[2][90]. Для целей итерации возьмите размер строки, используя s[i].size().