如何在旧版C++中初始化一个const std向量?

5

我的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++书中都应该有足够的例子。 - Sam Varshavchik
C++98 中的问题不在于您的向量是 const 还是非 const,而是标准阻止了花括号初始化。因此,请尝试使用以下代码:std::vector<int> vi {1, 2, 3};std::vector<int> vi = {1, 2, 3};// 它不会起作用。在那些日子里,您必须推入元素。 - Maestro
很遗憾,我没有使用C++11,所以myVector只能通过构造函数进行初始化。即使在C++11之后,包括std::vector在内的任何对象都只能通过使用构造函数来“初始化”(创建)。C++11的std::initializer_list之所以可以使用,是因为有一个定义好的接受它的构造函数 :) - Fareanor
3个回答

7

您可以从函数返回向量:

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

Alternatively, use boost::assign::list_of.


3

@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());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接