初始化一个字符串向量数组

82

能否初始化一个字符串向量数组?

例如:

static std::vector<std::string> v; //declared as a class member

我使用static只是为了初始化并填充它的字符串。如果不能像普通数组那样进行初始化,我应该在构造函数中填充它吗?


用什么来初始化它呢?当然有无数种方法可以进行初始化。 - Benjamin Lindley
static 不会“填充字符串”,std::vector 是一种动态数据结构,创建时为空。 - Blastfurnace
在这个上下文中,“static”意味着您的类的多个实例都共享相同的“v”,这是您真正想要的吗? - wkl
8个回答

84

现在是2023年,但这个帖子在我的搜索引擎中排名第一。今天,以下方法更受欢迎(初始化列表)。

std::vector<std::string> v = { "xyzzy", "plugh", "abracadabra" };
std::vector<std::string> v({ "xyzzy", "plugh", "abracadabra" });
std::vector<std::string> v{ "xyzzy", "plugh", "abracadabra" }; 

https://en.wikipedia.org/wiki/C%2B%2B11#Initializer_lists


68

有点类似:

class some_class {
    static std::vector<std::string> v; // declaration
};

const char *vinit[] = {"one", "two", "three"};

std::vector<std::string> some_class::v(vinit, end(vinit)); // definition

end只是为了避免在后面长度变化时需要重复编写vinit+3。请定义如下:

template<typename T, size_t N>
T * end(T (&ra)[N]) {
    return ra + N;
}

我可以直接使用 int numElements = sizeof(vinit)/4; 吗? - cpx
如果 sizeof(char*) 是4,那么是的。但在64位机器上就不一定了。我只是厌倦了每次迭代数组时都要输入一堆 sizeof 的东西。我的 end 函数对于数组的效果与 C++0x 中的 std::end 相同。 - Steve Jessop
如果不是很明显,当我说“我的” end 函数时,我指的是我的答案中的函数模板,与 C++0x 的 std::end 相对应。我并不声称发明了它! - Steve Jessop
@SteveJessop,你能解释一下end是如何工作的吗?我搞不明白。它还需要一个N作为参数,但你没有给它... - Roozbeh G
1
@RoozbehG:从参数vinit的类型const char* [3]中推断出N3。同样,T也从相同的类型中推断出为const char *。因此,编写end(vinit)就像编写end<const char*, 3>(vinit)一样,这要归功于模板参数推导。 - Steve Jessop
显示剩余3条评论

36

如果你正在使用cpp11(如果需要,可以启用-std=c++0x标志),那么你可以像这样简单地初始化向量:

如果您在使用cpp11(如有必要,请使用-std=c++0x标志进行启用),则可以像这样简单初始化向量:

// static std::vector<std::string> v;
v = {"haha", "hehe"};

15

11

由于MSVC 2010不支持使用std::initializer_list<>来初始化向量,但它支持std::end,以下是解决方案:

const char *args[] = {"hello", "world!"};
std::vector<std::string> v(args, std::end(args));

5
与@Moo-Juice相同:
const char* args[] = {"01", "02", "03", "04"};
std::vector<std::string> v(args, args + sizeof(args)/sizeof(args[0])); //get array size

1
这是否假设初始化列表中的所有args[]大小都相同? - jwillis0720
1
@jwillis0720:所有的args[n]实际上都是相同大小,确切地说是sizeof(char*)。原因是args存储了指向“thing”的指针(char*),而不是“thing”本身。 - Jürgen Schwietering

2

1

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