如何在C ++中声明一个string数组?

我想尽可能以最好的方式遍历静态string数组的所有元素。 我希望能够在一行中声明它,并且无需跟踪数字就可以轻松地添加/删除元素。 听起来很简单,不是吗?

可能的非解决scheme:

vector<string> v; v.push_back("abc"); b.push_back("xyz"); for(int i = 0; i < v.size(); i++) cout << v[i] << endl; 

问题 – 没有办法用一个string列表在一行上创build向量

可能的非解决scheme2:

 string list[] = {"abc", "xyz"}; 

问题 – 无法自动获取string的数量(我知道)。

必须有一个简单的方法来做到这一点。

助推分配库似乎正是你在找什么。 这使得容器比以往更容易分配常量。

C ++ 11添加了初始化列表以允许以下语法:

 std::vector<std::string> v = {"Hello", "World"}; 

至less在GCC 4.4中添加了对此C ++ 11function的支持,并且仅在Visual Studio 2013中添加了此function。

你可以从一个静态创build的char*数组简单地初始化一个vector<string>

 char* strarray[] = {"hey", "sup", "dogg"}; vector<string> strvector(strarray, strarray + 3); 

这样复制所有的string,所以你使用了两倍的内存。 你可以使用Will Dean的build议,在这里用arraysize(str_array)replace这个魔术数字3 – 虽然我记得有一些特殊的数组版本可能会做一些特殊情况Something Bad(抱歉,我不记得细节立即) 。 但它经常正常工作。

另外,如果你真的对某一行有兴趣,你可以定义一个可变参数macros,这样一行就可以像DEFINE_STR_VEC(strvector, "hi", "there", "everyone"); 作品。

问题 – 无法自动获取string的数量(我知道的)。

有一个这样做的标准方式,很多人(包括MS)定义macros如arraysize为:

 #define arraysize(ar) (sizeof(ar) / sizeof(ar[0])) 

在C ++中声明一个string数组,如下所示: char array_of_strings[][]

例如: char array_of_strings[200][8192];

将保存200个string,每个string的大小为8kb或8192字节。

使用strcpy(line[i],tempBuffer); 将数据放入string数组中。

一种可能性是使用NULL指针作为标志值:

 const char *list[] = {"dog", "cat", NULL}; for (char **iList = list; *iList != NULL; ++iList) { cout << *iList; } 

您可以使用Boost范围库中的beginend函数来轻松地find基本数组的末尾,与macros解决scheme不同的是,如果您不小心将其应用到指针,则会出现编译错误而不是错误的行为。

 const char* array[] = { "cat", "dog", "horse" }; vector<string> vec(begin(array), end(array)); 

你可以使用Will Dean的build议[ #define arraysize(ar) (sizeof(ar) / sizeof(ar[0])) )来将这个数字3replace为arraysize(str_array) – 虽然我记得有一些特例在这种特定版本的数组大小可能会做坏事(抱歉,我不记得细节立即)。 但它经常正常工作。

它不起作用的情况是“数组”实际上只是一个指针,而不是一个实际的数组。 另外,由于数组传递给函数的方式(转换为指向第一个元素的指针),即使签名看起来像一个数组,函数调用也不起作用 – some_function(string parameter[])实际上是some_function(string *parameter)

试图upvote克雷格H的答案,你应该使用boost :: assign,但我没有代表:(

我在1998年9月的C / C ++用户期刊第16卷第9期第73-74页的Andrei Alexandrescu读过的第一篇文章中遇到过类似的技术(有完整的引用,因为它在我的实现的注释中他的代码我一直在使用)。

模板是你的朋友。

而不是那个macros,我可以build议这个:

 template<typename T, int N> inline size_t array_size(T(&)[N]) { return N; } #define ARRAY_SIZE(X) (sizeof(array_size(X)) ? (sizeof(X) / sizeof((X)[0])) : -1) 

1)我们想使用一个macros来使其成为编译时常量; 函数调用的结果不是编译时常量。

2)但是,我们不想使用一个macros,因为这个macros可能会被意外的用在一个指针上。 该函数只能用于编译时数组。

因此,我们使用函数的定义来使macros“安全”。 如果函数存在(即它的大小不是零),那么我们使用上面的macros。 如果函数不存在,我们返回一个错误的值。

 #include <boost/foreach.hpp> const char* list[] = {"abc", "xyz"}; BOOST_FOREACH(const char* str, list) { cout << str << endl; } 

这是一个例子:

 #include <iostream> #include <string> #include <vector> #include <iterator> int main() { const char* const list[] = {"zip", "zam", "bam"}; const size_t len = sizeof(list) / sizeof(list[0]); for (size_t i = 0; i < len; ++i) std::cout << list[i] << "\n"; const std::vector<string> v(list, list + len); std::copy(v.begin(), v.end(), std::ostream_iterator<string>(std::cout, "\n")); } 
 #include <iostream> #include <string> #include <vector> #include <boost/assign/list_of.hpp> int main() { const std::vector< std::string > v = boost::assign::list_of( "abc" )( "xyz" ); std::copy( v.begin(), v.end(), std::ostream_iterator< std::string >( std::cout, "\n" ) ); } 
 #include <iostream.h> #include <iomanip.h> int main() { int n; cout<<"enter the maximum number\n"; cin>>n; cout<<"enter the first number\n"; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { cin>>a[i][j]; } } cout<<"enter the second number\n"; for(int i=0;i<n;i++) { for(int k=0;k<n;k++) { cin>>b[i][k]; } } cout<<"the product will be\n"; for(int i=0;i<n;i++) { for(int g=0;g<n;g++) { c[i][g]=c[i][c]*c[i][j]; cout<<setw(5)<<c[i][g]; } cout<<endl; } return 0; } 

你可以直接声明一个string数组像string s[100]; 。 那么如果你想访问特定的元素,你可以像s[2][90]一样直接获取它。 为了迭代目的,使用s[i].size()函数获取string的大小。