我试图以最好的方式迭代静态字符串数组的所有元素。我希望能够在一行上声明它并轻松添加/删除元素,而无需跟踪数字。听起来很简单,不是吗?
可能的非解决方案:
vector<string> v;
v.push_back("abc");
b.push_back("xyz");
for(int i = 0; i < v.size(); i++)
cout << v[i] << endl;
问题 - 无法使用字符串列表在一行上创建向量
可能的非解决方案2:
string list[] = {"abc", "xyz"};
问题 - 无法自动获取字符串数量(我知道)。
必须有一种简单的方法。
答案 0 :(得分:104)
C ++ 11添加了初始化列表以允许以下语法:
std::vector<std::string> v = {"Hello", "World"};
至少在GCC 4.4和Visual Studio 2013中添加了对此C ++ 11功能的支持。
答案 1 :(得分:36)
您可以从静态创建的vector<string>
数组中简明地初始化char*
:
char* strarray[] = {"hey", "sup", "dogg"};
vector<string> strvector(strarray, strarray + 3);
顺便说一下,这会复制所有字符串,因此你会使用两倍的内存。您可以使用Will Dean的建议在这里用arraysize(str_array)替换幻数3 - 虽然我记得有一些特殊情况,其中特定版本的arraysize可能会做坏事(抱歉我不能立即记住细节) 。但它经常正常工作。
另外,如果你真的对这一行很感兴趣,你可以定义一个可变参数宏,以便DEFINE_STR_VEC(strvector, "hi", "there", "everyone");
之类的单行可以工作。
答案 2 :(得分:26)
boost assign library似乎正是您正在寻找的。它使得容器的容量比以往更容易分配。
答案 3 :(得分:23)
问题 - 无法自动获取字符串数量(我知道)。
有一种沼泽标准的方法,很多人(包括MS)定义了像arraysize
这样的宏:
#define arraysize(ar) (sizeof(ar) / sizeof(ar[0]))
答案 4 :(得分:9)
在C ++中声明一个字符串数组,如下所示:char array_of_strings[][]
例如:char array_of_strings[200][8192];
将包含200个字符串,每个字符串的大小为8kb或8192字节。
使用strcpy(line[i],tempBuffer);
将数据放入字符串数组中。
答案 5 :(得分:7)
一种可能性是使用NULL指针作为标志值:
const char *list[] = {"dog", "cat", NULL};
for (char **iList = list; *iList != NULL; ++iList)
{
cout << *iList;
}
答案 6 :(得分:4)
您可以使用Boost范围库中的begin
和end
函数轻松找到基本数组的末尾,与宏解决方案不同,这将产生编译错误而不是破坏行为如果你不小心将它应用于指针。
const char* array[] = { "cat", "dog", "horse" };
vector<string> vec(begin(array), end(array));
答案 7 :(得分:3)
以下是一个例子:
#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"));
}
答案 8 :(得分:3)
您可以使用Will Dean的建议[
#define arraysize(ar) (sizeof(ar) / sizeof(ar[0]))
]在这里用arraysize(str_array)替换幻数3 - 虽然我记得有一些特殊情况,其中特定版本的arraysize可能会做坏事(抱歉,我不记得细节了。但它经常正常工作。
它不起作用的情况是“数组”实际上只是一个指针,而不是一个实际的数组。此外,由于数组传递给函数的方式(转换为指向第一个元素的指针),即使签名看起来像一个数组,它也无法跨函数调用 - some_function(string parameter[])
实际上是{{1} }。
答案 9 :(得分:3)
尝试upvote Craig H的回答你应该使用boost :: assign,但我没有代表:(
我在Andrei Alexandrescu在 C / C ++用户期刊,第16卷,第9期,1998年9月,第73-74页中读到的第一篇文章中遇到了类似的技巧(有完整的引用,因为它是我执行他的代码的评论,我从那时起一直在使用。)
模板是你的朋友。
答案 10 :(得分:2)
而不是那个宏,我可以建议这个:
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)我们想使用宏来使它成为编译时常量;函数调用的结果不是编译时常量。
2)但是,我们不想使用宏,因为宏可能会意外地用在指针上。该函数只能用于编译时数组。
因此,我们使用函数的定义来使宏“安全”;如果函数存在(即它具有非零大小),那么我们使用上面的宏。如果该函数不存在,则返回错误值。
答案 11 :(得分:2)
#include <boost/foreach.hpp>
const char* list[] = {"abc", "xyz"};
BOOST_FOREACH(const char* str, list)
{
cout << str << endl;
}
答案 12 :(得分:1)
#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" ) );
}
答案 13 :(得分:1)
#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;
}
答案 14 :(得分:1)
您可以直接声明像string s[100];
这样的字符串数组。
然后,如果您想访问特定元素,可以像s[2][90]
一样直接获取。出于迭代目的,使用的是字符串的大小
s[i].size()
功能。