【问题标题】:How to initialize a const std vector in old c++?如何在旧 C++ 中初始化 const std 向量?
【发布时间】:2020-02-20 12:04:11
【问题描述】:

我的 C++ 编译器标识是 GNU 4.4.1

我认为从 c++ 11 开始,您可以通过这种方式初始化向量:

const std::vector<int> myVector = {1, 2, 3};
const std::vector<int> myVector2{1, 2, 3};

不幸的是,我没有使用 c++ 11,所以 myVector 只能由构造函数初始化。 我需要创建一个永远不会被修改的向量。它必须由类中的不同函数共享,因此它也可以是静态的,甚至是类成员。 有没有办法让我的向量在 c++98 中定义时被初始化,就像上面的例子一样,或者类似的东西?

【问题讨论】:

  • 是的,这恰好被称为“动态初始化”,在每本 C++ 书籍中都应该有很多示例。
  • C++98 中的问题不在于你的向量是 const 还是非常量,而是标准阻止了花括号初始化。所以试试这个:std::vector&lt;int&gt; vi {1, 2, 3};std::vector&lt;int&gt; vi = {1, 2, 3};// 它不起作用。在那些日子里,你必须推动元素。
  • “很遗憾,我没有使用 c++ 11,所以 myVector 只能由构造函数初始化” 好吧,即使在 C++11 之后,任何对象,包括 std::vector,只能使用构造函数“初始化”(创建)。只能使用 C++11 std::initializer_list,因为有一个定义的构造函数接受它:)

标签: c++ constants stdvector c++98


【解决方案1】:

您可以从函数中返回向量:

std::vector<int> f();
const std::vector<int> myVector = f();

或者,使用boost::assign::list_of

【讨论】:

    【解决方案2】:

    @vll 的答案可能更好,但你也可以这样做:

    int temp[] = {1, 2, 3};
    const std::vector<int> myVector(temp, temp + sizeof(temp)/sizeof(temp[0]));
    

    然而,它确实创建了两个副本而不是一个副本,并且它用数组的名称污染了命名空间。

    【讨论】:

      【解决方案3】:

      你已经得到了两个很好的答案。这只是两者的结合:

      namespace detail {
          template<typename T, size_t N>
          size_t size(const T (&)[N]) { return N; }
      
          std::vector<int> vecinit() {
              int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
              return std::vector<int>(arr, arr+size(arr));
          }
      }
      
      //...
      
      const std::vector<int> myVector(detail::vecinit());
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-16
        • 2015-03-25
        • 2018-10-17
        • 1970-01-01
        • 1970-01-01
        • 2012-12-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多