如何在C ++中最好地初始化字符串向量?

时间:2014-01-16 21:31:00

标签: c++

我一般都喜欢python的语法。

v = [“sds”,“bsdf”,“dsdfaf”]

我目前在C ++中拥有的内容如下所示

vector<string> v;
v.push_back("sds");
v.push_back("bsdf");
v.push_back("dsdfaf");

有更好/更清洁的方法吗?请注意,初始化后v保持不变。所以一个数组也可能有用,但是数组的问题是我需要在代码中硬编码数组的长度。

char* v[] = {"sds", "bsdf", "dsdfaf"};
for (int i = 0; i < 3; ++i) do_something(v[i]);

编辑:我没有C ++ 11。我的编译器是gcc 4.1.2

4 个答案:

答案 0 :(得分:4)

C ++ 03解决方案:

使用带有一对迭代器的向量构造函数。

char* arr[] = {"sds", "bsdf", "dsdfaf"};
vector<string> v(arr, arr + sizeof(arr)/sizeof(arr[0]));

如果初始化后不需要更改长度,请使用数组。为避免硬编码数组长度,请使用此函数模板推导出大小

template<typename T, std::size_t N>
std::size_t length_of( T const (&)[N] ) { return N; }

char* v[] = {"sds", "bsdf", "dsdfaf"};
for (int i = 0; i < length_of(v); ++i) do_something(v[i]);

请注意,这不会在您传递char **的函数中起作用。


使用boost::assign::list_of

using boost::assign::list_of;
std::vector<std::string> v = list_of("sds")("bsdf")("dsdfaf");

答案 1 :(得分:3)

在C ++ 11中,你可以写:

std::vector<std::string> v{"sds", "bsdf", "dsdfaf"};

答案 2 :(得分:2)

  

有更好/更清洁的方法吗?

您可以使用大括号初始化语法

std::vector<std::string> v { "sds", "bsdf", "dsdfaf" };

  

请注意,初始化后v保持不变。

您可以使用std::array(自C ++ 11起):

std::array<std::string, 3> a {{ "sds", "bsdf", "dsdfaf" }};

你仍然需要“硬编码”元素的数量,但它不是动态的,所以你不会失去太多。

答案 3 :(得分:0)

  

请注意,初始化后v保持不变。所以一个数组也可能有用,但是数组的问题是我需要在代码中硬编码数组的长度。

那不是真的。你可以像以下那样以规范的方式获得数组大小:

#include <iostream>

int main()
{
    char const * const v[] = {"sds", "bsdf", "dsdfaf"};

    // Only works when array length is known at compile-time.
    size_t const len = sizeof(v) /sizeof(v[0]);
    for (size_t i = 0; i < len; ++i)
        std::cout << v[i] << '\n';
}

输出结果为:

$ g++ -Wall foo.cpp ; ./a.out 
sds
bsdf
dsdfaf