Блог пользователя Neodym

Автор Neodym, 11 лет назад, По-русски

Подскажите пожалуйста, как обьявлять массив из строк в С++, чтобы к строкам можно было обращаться образом вроде A[i]?

Следующие способы не срабатывают:

string A[N];

или

vector< string > a(N);

UPD: Понял и осознал. Спасибо всем, кто ответил.

PS: Спасибо за минусы:D

  • Проголосовать: нравится
  • -3
  • Проголосовать: не нравится

»
11 лет назад, # |
  Проголосовать: нравится +2 Проголосовать: не нравится

Оба этих способа работают. Что именно не получается, какие конкретные ошибки появляются?

  • »
    »
    11 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Если написать cout<<A[i], ничего не произодйдет. Сортировать как sort(A,A+N,comparator) тоже не хочет(точнее, сортирует как-то, но если вывести все элементы, выведет какой-то бред)

»
11 лет назад, # |
  Проголосовать: нравится +1 Проголосовать: не нравится

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

  • »
    »
    11 лет назад, # ^ |
      Проголосовать: нравится +2 Проголосовать: не нравится

    А vector< string > a(N); не динамический?

    • »
      »
      »
      11 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      Поясню. Я о способе который предполагает написание руками слова new.

»
11 лет назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

vector<string> a(N, string(n, ' ')); может такого хочется?

  • »
    »
    11 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    А что это?

    • »
      »
      »
      11 лет назад, # ^ |
        Проголосовать: нравится +1 Проголосовать: не нравится

      ну по дефолту в массив кладутся пустые строки, а так будут длины n, заполненные пробелами

»
11 лет назад, # |
  Проголосовать: нравится +12 Проголосовать: не нравится
vector<string> list(10);

for(int i = 0; i < 10; ++i)
    list[i] = "abc";

for(int i = 0; i < 10; ++i)
    cout << list[i] << '\n';

И не говорите, что это не работает.

  • »
    »
    11 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    А вот так вот делать, как я понял, нельзя:

    string A[N];

    for(long i = 0; i < K; i++) cin>>A[1][i];

    • т.е. считывать строку посимвольно
    • »
      »
      »
      11 лет назад, # ^ |
      Rev. 3   Проголосовать: нравится +4 Проголосовать: не нравится

      Формально можно. Здесь проблема не в том, что это в принципе делать нельзя, а в том, что у вас получается выход за пределы массива (строки, в данном случае), так как это считывание символов не изменяет размер строки. А в данном примере строки изначально нулевого размера.

      Если бы было что-то вроде

      A[1]="1111111111111111111111111111111111111111111111111111111111111"; for (int i=0;i<K;i++)cin>>A[1][i];

      то такой код будет работать при не слишком больших К (он будет считывать символы и заменять единицы в оригинальной строке на эти символы).

      upd: рабочая версия вашего кода может выглядеть, к примеру, так:

      char c; for (int i=0;i<k;i++){cin>>c;A[1]+=c;}

      • »
        »
        »
        »
        11 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится

        Спасибо!

        • »
          »
          »
          »
          »
          11 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится

          Чтение данных до первого пробельного символа:

          string s;
          
          cin >> s;

          Чтение данных до конца строки:

          string s;
          
          getline(cin, s);

          Если уж очень хочется добавлять символы по одному, то тогда так, как написал I_love_Tanya_Romanova. Во всех случаях string сам выделит столько памяти, сколько нужно.

    • »
      »
      »
      11 лет назад, # ^ |
        Проголосовать: нравится +1 Проголосовать: не нравится

      И еще. string A[N];

      Проблема в том, что нельзя задавать размер статического массива переменной, нужно только константой, то есть только так:

      string A[1000]; либо const int N = 1000; string A[N];

      это потому что память, под этот массив выделяется на этапе компиляции, а не во время выполнения программы как вы хотите.

      • »
        »
        »
        »
        11 лет назад, # ^ |
          Проголосовать: нравится +1 Проголосовать: не нравится

        По поводу размера статических массивов, тут есть одна оговорка: по стандарту C99 языка Си можно задавать локальные массивы переменной длины. В частности, в GNU C++ такая фича поддерживается(но не в MSVC). Источник

        Это так, вдруг кто не знает.