3

首先,如果这是一个令人眼花缭乱的简单而明显的问题,我想道歉。我知道这对有专业知识的人来说是相当容易的。C++11 允许以列表形式初始化向量:

std::vector<std::string> v = {
    "this is a",
    "list of strings",
    "which are going",
    "to be stored",
    "in a vector"};

但这在旧版本中不可用。我一直在尝试考虑填充字符串向量的最佳方法,到目前为止,我真正能想到的唯一方法是:

std::string s1("this is a");
std::string s2("list of strings");
std::string s3("which are going");
std::string s4("to be stored");
std::string s5("in a vector");

std::vector<std::string> v;
v.push_back(s1);
v.push_back(s2);
v.push_back(s3);
v.push_back(s4);
v.push_back(s5);

它有效,但写起来有点麻烦,我相信有更好的方法。

4

3 回答 3

6

规范的方法是在合适的标头中定义begin()和函数,并使用如下内容:end()

char const* array[] = {
    "this is a",
    "list of strings",
    "which are going",
    "to be stored",
    "in a vector"
};
std::vector<std::string> vec(begin(array), end(array));

函数begin()end()定义如下:

template <typename T, int Size>
T* begin(T (&array)[Size]) {
    return array;
}
template <typename T, int Size>
T* end(T (&array)[Size]) {
    return array + Size;
}
于 2013-09-30T22:24:18.550 回答
4

正如克里斯指出的那样,您可以将所有文字存储到数组中,然后从该数组初始化向量:

#include <vector>
#include <iostream>
#include <string>

int main()
{
        const char* data[] = {"Item1", "Item2", "Item3"};
        std::vector<std::string> vec(data, data + sizeof(data)/sizeof(const char*));
}

您不需要显式转换为std::string.

于 2013-09-30T22:21:57.787 回答
1

如果您对 C++11 之前的 C++“卡住”,那么只有几种选择,而且它们不一定“更好”。

首先,您可以创建一个常量 C 字符串数组并将它们复制到向量中。您可能会节省一点打字时间,但是您会在其中有一个复制循环。

其次,如果您可以使用 boost,则可以使用 boost::assign 的 list_of,如本答案中所述

于 2013-09-30T22:19:32.290 回答