我正在尝试以最佳方式迭代静态字符串数组的所有元素。我希望能够在一行中声明它,并轻松地添加/删除其中的元素,而无需跟踪数字。听起来很简单,不是吗?

可能的非解决方案:

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"};

问题 - 无法自动获取字符串的数量(据我所知)。

一定有一种简单的方法可以做到这一点。

有帮助吗?

解决方案

提升分配库 似乎正是您正在寻找的东西。它使得将常量分配给容器比以往任何时候都更容易。

其他提示

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

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

至少添加了对这个 C++ 11 功能的支持 海湾合作委员会4.4 并且仅在 视觉工作室2013.

您可以简洁地初始化一个 vector<string> 从静态创建的 char* 大批:

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

顺便说一句,这会复制所有字符串,因此您使用了两倍的内存。您可以使用 Will Dean 的建议将此处的幻数 3 替换为 arraysize(str_array) ——尽管我记得在某些特殊情况下,特定版本的 arraysize 可能会做一些坏事(抱歉,我无法立即记住详细信息) 。但它通常都能正常工作。

另外,如果您真的热衷于一行代码,您可以定义一个可变参数宏,以便单行代码例如 DEFINE_STR_VEC(strvector, "hi", "there", "everyone"); 作品。

问题 - 无法自动获取字符串的数量(据我所知)。

有一种标准的方法可以做到这一点,很多人(包括 MS)定义了如下宏: arraysize 为了:

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

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

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

将容纳 200 个字符串,每个字符串的大小为 8kb 或 8192 字节。

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

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

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

您可以使用 beginend Boost range 库中的函数可以轻松找到原始数组的末尾,并且与宏解决方案不同,如果您不小心将其应用于指针,这将给出编译错误而不是破坏行为。

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

你可以使用威尔·迪恩的建议[#define arraysize(ar) (sizeof(ar) / sizeof(ar[0]))] 用 arraysize(str_array) 替换此处的幻数 3 ——尽管我记得在某些特殊情况下,特定版本的 arraysize 可能会做一些坏事(抱歉,我无法立即记住详细信息)。但它通常都能正常工作。

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

试图支持 Craig H 的回答,你应该使用 boost::assign,但我没有代表:(

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

模板是你的朋友。

这是一个例子:

#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"));
}

我可以建议这个宏来代替那个宏:

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) 但是,我们不想使用宏,因为宏可能会意外地用在指针上。该函数只能用于编译时数组。

因此,我们利用函数的定义性来使宏“安全”;如果该函数存在(即它具有非零大小)然后我们使用上面的宏。如果该函数不存在,我们将返回一个错误值。

#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 <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 s[100];。然后如果你想访问特定的元素,你可以直接获取它,比如 s[2][90]. 。出于迭代目的,请使用以下命令获取字符串的大小s[i].size() 功能。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top