我试图在C ++中为一个多维char数组的列分配一个像“hello”这样的字符串。例如,当它完成时,2D数组的第一列应该从上到下变为“hello”。
我正在寻找一个简单的解决方案,而不使用for循环,例如使用strcpy()。是否可以?
答案 0 :(得分: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;
}
注意它是怎样的
for
,这实际上非常简洁,当然有助于隐藏在C ++中使用2-dim数组的所有 clutter 否则会让你暴露。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");
现场演示 Here on 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";
}
答案 1 :(得分: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
的行维度,则不会进行边界检查。
答案 2 :(得分: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;
}