Почему это объявление вектора недействительно? - PullRequest
2 голосов
/ 18 января 2020

Ошибка, которую я получаю: «Ожидается a;».

    const int SIZE = 9;

    vector<string>possiblePalindromes(SIZE) = // error is shown here
        { "A man a plan a canal Panama",
          "The rain in Spain",
          "No lemon, no melon",
          "radar",
          "CS1D",
          "Was it a cat I saw?",
          "Racecar",
          "Saddleback",
          "dad" };

Мой вопрос: не будет ли это действительным объявлением? Ошибка исчезнет, ​​если я удалю (SIZE), но я намерен объявить вектор с указанным размером c и набором предопределенных значений. Таким образом, когда я решу выполнить итерацию по вектору, например

for (int i = 0; i < SIZE; ++i)

, я могу напрямую обратиться к РАЗМЕРУ вектора, а не к некоторой константе «9».

Мне кажется, что это не работает: когда я делаю

vector<string>possiblePalindromes(SIZE)

, я объявляю вектор размера 9 с 9 строковыми значениями по умолчанию. Это означает, что все, что заключено в {}, вообще не читается в векторе.

Ответы [ 3 ]

3 голосов
/ 18 января 2020

Или, если вам нужен постоянный размер, вы можете использовать вместо него std::array (обратите внимание, что размер - это аргумент шаблона, такой как std::string, не переданный в ()):

const int SIZE = 9; 

std::array<std::string, SIZE> possiblePalindromes = 
    { "A man a plan a canal Panama",
      "The rain in Spain",
      "No lemon, no melon",
      "radar",
      "CS1D",
      "Was it a cat I saw?",
      "Racecar",
      "Saddleback",
      "dad" };
3 голосов
/ 18 января 2020

Фактически вы пытаетесь инициализировать объект типа std::vector<std::string>, используя два конструктора одновременно.

Первый конструктор - это

explicit vector(size_type n, const Allocator& = Allocator()); 

, а второй конструктор

vector(initializer_list<T>, const Allocator& = Allocator()); 

Это не имеет смысла.

Вы всегда можете получить количество элементов в векторе, используя его функцию-член size. И вы всегда можете изменить размер вектора, используя его метод resize.

Более того, вы можете использовать основанный на диапазоне диапазон для l oop, где знание количества элементов не требуется.

Так что просто напишите

vector<string>possiblePalindromes = 
    { "A man a plan a canal Panama",
      "The rain in Spain",
      "No lemon, no melon",
      "radar",
      "CS1D",
      "Was it a cat I saw?",
      "Racecar",
      "Saddleback",
      "dad" };

Вот демонстрационная программа

#include <iostream>
#include <string>
#include <vector>

int main() 
{
    std::vector<std::string> possiblePalindromes = 
    { 
        "A man a plan a canal Panama",
        "The rain in Spain",
        "No lemon, no melon",
        "radar",
        "CS1D",
        "Was it a cat I saw?",
        "Racecar",
        "Saddleback",
        "dad" 
    };

    std::cout << "The vecor contains " << possiblePalindromes.size() << " elements\n";

    std::cout << "They are:\n";

    for ( const auto &s : possiblePalindromes )
    {
        std::cout << '\t' << s << '\n';
    }

    return 0;
}

Ее вывод

The vecor contains 9 elements
They are:
    A man a plan a canal Panama
    The rain in Spain
    No lemon, no melon
    radar
    CS1D
    Was it a cat I saw?
    Racecar
    Saddleback
    dad
0 голосов
/ 18 января 2020

потому что дана инициализация одного целочисленного аргумента векторного объекта, ie. его размер, инициализация векторного значения не допускается.
Одновременно может быть объявлен только один из них.

может это помочь

  const int SIZE = 9;
  vector<string>possiblePalindromes =  //
        { "A man a plan a canal Panama",
          "The rain in Spain",
          "No lemon, no melon",
          "radar",
          "CS1D",
          "Was it a cat I saw?",
          "Racecar",
          "Saddleback",
          "dad" };


possiblePalindromes.resize(SIZE);     // decides the size now

for (int i = 0; i < SIZE; ++i)
   // ...
...