初始化字符串的向量数组


73

可以初始化字符串的向量数组。

例如:

static std::vector<std::string> v; //声明为班级成员

static只是用来初始化并用字符串填充它。或者,如果不能像常规数组那样初始化它,我应该在构造函数中填充它。


到底用什么初始化它?当然,有许多种初始化它的方法。
本杰明·林德利

static不会“用字符串填充”。std :: vector是动态数据结构,被创建为空。
高炉

static在这种情况下,意味着您的课程的多个实例都共享相同的东西v,那是您真正想要的吗?
2010年

Answers:


65

有点:

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

@cpx:如果sizeof(char*)是4,是的。在64位计算机上没有那么多。sizeof每次迭代数组时,我只是无聊键入很多东西。我的end函数对数组的作用与std::endC ++ 0x相同。
史蒂夫·杰索普

如果不太明显,当我说“我的”end函数时,我的意思是答案中的函数模板,与C ++ 0x的相反std::end。我不声称自己发明了它!
史蒂夫·杰索普

@SteveJessop您能解释一下末端如何工作吗?我不知道。它也需要N作为参数,但是您不要
屈服。

1
@RoozbehG:N推导出作为3从参数的类型vinit,这是const char* [3]。为此,T也可以推论为const char *相同的类型。因此,编写end(vinit)就像end<const char*, 3>(vinit)通过模板参数推导编写。
史蒂夫·杰索普

51

现在是2017年,但是此线程在我的搜索引擎中排名最高,今天首选以下方法(初始化列表)

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


33

如果您使用的是cpp11(-std=c++0x如果需要,请启用标志),则可以像这样简单地初始化向量:

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


10

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
这不是假设init列表中的所有args []的大小都一样吗?
jwillis0720

1
@ jwillis0720:所有args [n]的大小实际上都是相同的,准确地说是sizeof(char *)。原因是args存储指向“事物”而不是“事物”本身的指针(char *)。
尔根·施维特灵


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.