1

我正在尝试为 C++ 中的多维 char 数组的列分配一个类似“hello”的字符串。例如,当它完成时,二维数组的第一列应该从上到下变为“hello”。

我正在寻找一个不使用 for 循环的简单解决方案,例如使用 strcpy()。这可能吗?

4

3 回答 3

0

我强烈建议不要使用 C++ 中的原始多维数组——它们容易出错且不灵活。考虑 Boost MultiArray。

也就是说,您始终可以通过编写辅助函数来“隐藏”复杂性。这是一个相当通用的版本,适用于任何大小/元素类型的二维数组:

template<typename T, size_t N, size_t M>
   void setColumn(T(&arr)[N][M], size_t col, std::string const& val)
{
    assert(col>=0 && col <M);

    for (auto& row : arr)
        row[col] = val;
}

注意它是如何

  • 通过引用获取数组,因此模板参数推导可用于“感知”维度边界(N,M)
  • 它断言列索引实际上是有效的(奖励功能)
  • 它使用 range-based for,这实际上非常简洁,并且肯定有助于隐藏在 C++ 中使用 2-dim 数组否则会暴露给您的所有混乱。

如何使用它?

std::string arr[][7] = {
    { "0", "1", "2", "3", "4", "5", "6" },
    { "0", "1", "2", "3", "4", "5", "6" },
    { "0", "1", "2", "3", "4", "5", "6" },
    { "0", "1", "2", "3", "4", "5", "6" },
    { "0", "1", "2", "3", "4", "5", "6" },
    { "0", "1", "2", "3", "4", "5", "6" },
};

// straightforward:
setColumn(arr, 0, "hello");

或者,如果您不喜欢“说出”哪个数组,请使用 lambda:

// to make it even more concise
auto setColumn = [&](int c, std::string const& val) mutable { ::setColumn(arr, c, val); };

setColumn(3, "world");

现场演示在 Coliru 上进行并打印

hello;1;2;world;4;5;6;
hello;1;2;world;4;5;6;
hello;1;2;world;4;5;6;
hello;1;2;world;4;5;6;
hello;1;2;world;4;5;6;
hello;1;2;world;4;5;6;

使用简单的代码

// dump it for demo purposes
for (auto& row : arr)
{
    std::copy(begin(row), end(row), std::ostream_iterator<std::string>(std::cout, ";"));
    std::cout << "\n";
}
于 2013-08-04T16:32:58.590 回答
0

使用 strcpy():

#include <string.h>
#include <iostream>
using namespace std;

int main()
{    
        const int rows = 10; 
        const int cols = 10; 
        const int wordlen = 255;

        char a[rows][cols][wordlen];
        for (int ix = 0; ix < rows ; ++ix)
            strcpy(a[ix][0] , "hello");
        for (int ix = 0; ix < rows ; ++ix)
            cout << a[ix][0] << endl;
}

使用 for_each() 函数:

#include<algorithm>
#include <iostream>
using namespace std;

string* val(string *s) 
{
    s[0] = "hello";
    return s;
}

int main()
{    
        const int rows = 8;
        const int cols = 8;

        string a[rows][cols];
        for (int ix = 0; ix < rows; ++ix)
            for (int jx = 0; jx < cols; ++jx)
                a[ix][jx] = "something";
        for_each(a,a+rows,val);
        for (int ix = 0; ix < rows; ++ix)
            for (int jx = 0; jx < cols; ++jx)
                cout << "a[" << ix << "][" << jx << "] = " << a[ix][jx] << endl;
}
于 2013-08-04T16:52:14.573 回答
0

AFAIK 没有办法使用标准库函数来做到这一点。

然而,通过一个简单的循环来完成是一件容易的事情:

std::size_t col = 0;
std::string s{"hello"};
for (std::size_t i = 0; i != s.size(); ++i) {
    arr[i][col] = s[i];
}

请注意,这不会进行边界检查是否s.size()大于arr.

现场示例:http: //ideone.com/K63uDQ

于 2013-08-04T16:38:43.573 回答