【问题标题】:Why is this declaration of a vector invalid?为什么这个向量声明无效?
【发布时间】:2020-01-17 22:22:17
【问题描述】:

我得到的错误是“预期为 ;”。

    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),错误就会消失,但我的目的是声明具有特定大小和一组预定义值的向量。这样当我决定遍历向量时,就像

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

我可以直接引用向量的大小,而不是一些常数“9”。

我对这不起作用的暗示是当我这样做时

vector<string>possiblePalindromes(SIZE)

我用 9 个字符串默认值声明大小为 9 的向量。这意味着 {} 中包含的所有内容根本不会被读入向量。

【问题讨论】:

  • 为什么不直接消除 SIZE 并使用基于范围的 for、迭代器或 possiblePalindromes.size() 进行迭代?
  • .size() 函数会是更好的方法。谢谢。

标签: c++ string vector constructor initializer-list


【解决方案1】:

实际上,您正在尝试同时使用两个构造函数来初始化 std::vector&lt;std::string&gt; 类型的对象。

第一个构造函数如下

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

第二个构造函数是

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

这没有意义。

您始终可以通过使用其成员函数size 来获取向量中元素的数量。而且您始终可以使用其方法resize 调整向量的大小。

此外,您可以在不需要知道元素数量的情况下使用基于范围的 for 循环。

那就写吧

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

【讨论】:

    【解决方案2】:

    或者,如果你想要恒定的大小,你可以使用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】:

      因为已经给出了向量对象的一个​​整数参数初始化,即。它的大小,向量值的初始化被阻止。
      一次只能声明其中一个。

      希望对您有帮助

        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)
         // ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-15
        • 1970-01-01
        • 2013-07-23
        • 1970-01-01
        • 1970-01-01
        • 2017-03-08
        相关资源
        最近更新 更多