Вопрос

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

Возможные неисполнения:

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

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

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

Это было полезно?

Решение

библиотека повышения назначений , по-видимому, быть именно тем, что вы ищете. Это делает назначение констант контейнерам проще, чем когда-либо.

Другие советы

В C ++ 11 добавлены списки инициализации, позволяющие использовать следующий синтаксис:

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

Поддержка этой функции C ++ 11 была добавлена, по крайней мере, в ССАГПЗ 4.4 и только в Visual Studio 2013.

Вы можете кратко инициализировать vector<string> из статически созданного массива char*:

char* strarray[] = {"hey", "sup", "dogg"};
vector<string> strvector(strarray, strarray + 3);

Кстати, это копирует все строки, поэтому вы используете вдвое больше памяти. Вы можете использовать предложение Уилла Дина, чтобы заменить магическое число 3 здесь на arraysize (str_array) - хотя я помню, что был какой-то особый случай, когда эта конкретная версия массива могла бы сделать что-то плохое (извините, я не могу сразу вспомнить детали) , Но это очень часто работает правильно.

Кроме того, если вы действительно любите одну строку, вы можете определить макрос с переменными значениями, чтобы работала одна строка, например 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 строк, каждая строка имеет размер 8 КБ или 8192 байта.

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

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

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

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

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 могла сделать что-то плохое (извините, я не могу вспомнить детали сразу). Но это очень часто работает правильно.

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

Пытался поддержать ответ Крейга Эйча о том, что вам следует использовать boost::assign, но у меня нет репутации :(

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

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

Вот пример:

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

Вместо этого макроса я мог бы предложить этот:

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

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

#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 <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]. Для итерационных целей возьмите размер строки, используя s[i].size() функция.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top