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

8

我一般喜欢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。


5
[std::vectorstd::string v { "lol", "lol2", "lol3" };]: - Borgleader
2
你到底在使用哪个编译器,才会说你“没有C++11”?C++11只是一个标准,不同的编译器支持不同数量的功能,但极少数的编译器不支持任何功能。 - bcrist
http://www.boost.org/doc/libs/1_55_0/libs/assign/doc/index.html - balki
闲聊好奇问题。为什么人们不将编译器升级至最新版本? - Gasim
@Gasim,我不能这样做。这是一个计算集群。如果你问为什么他们不这样做,我想原因是兼容性和懒惰吧 :) - Mohammad Moghimi
显示剩余2条评论
4个回答

4

C++03解决方案:

使用一个接受迭代器对的vector构造函数。

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
在我看来,所有这些方法都不如使用 push_back 原始方法清晰(我指的是可读性)。更短并不一定更清晰。 - bcrist
@bcrist 我同意又不同意。使用 push_back 时,意图立即清晰明了,但如果您要初始化具有大量元素的向量,则过于重复和冗长。在这种情况下,数组版本将是我的选择,因为 OP 表示他在初始化后不需要修改大小。 - Praetorian
如果有超过5或6个元素,那么代码会变得有些重复。可以说,C++98/C++03代码并不总是像Python一样简洁。 - bcrist
我喜欢 length_of one。 - Mohammad Moghimi
1
我更喜欢arrconst - John Dibling

4
在C++11中,您可以编写以下代码:
std::vector<std::string> v{"sds", "bsdf", "dsdfaf"};

似乎无法与clang 12.0一起使用。 - R.J. Dunnill

2

有更好/更干净的方法来做这件事吗?

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

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

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

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

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

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


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

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