vector<vector<int>> AsumB(
int kolumny, vector<vector<int>> matrix1, vector<vector<int>> matrix2) {
vector<vector<int>>matrix(kolumny);
matrix = vector<vector<int>>(matrix1.size());
for (int i = 0; i < kolumny; ++i)
for (int j = 0; i <(static_cast<signed int>(matrix1.size())); ++i)
matrix[i][j] = matrix1[i][j] + matrix2[i][j];
return matrix;
}
请告诉我我不理解并帮助我解决这个问题 因为对于1维向量,这种描述会起作用;
答案 0 :(得分:0)
怎么样?
vector<vector<int>> AsumB(vector<vector<int>> const & matrix1,
vector<vector<int>> const & matrix2) {
vector<vector<int>> matrix(matrix1);
for (std::size_t i = 0U; i < matrix.size(); ++i)
for (std::size_t j = 0U; j < matrix[j].size(); ++j)
matrix[i][j] += matrix2[i][j];
return matrix;
}
答案 1 :(得分:0)
无法重现,并且OP报告的编译器错误看起来与代码不匹配,因此问题可能在其他地方。
然而,这里存在很多错误,可能导致各种应该解决的问题。我已经冒昧地重新格式化代码以使解释更容易
vector<vector<int>> AsumB(int kolumny,
vector<vector<int>> matrix1,
vector<vector<int>> matrix2)
matrix1
和matrix2
按值传递。逻辑上没有任何错误,但这意味着除非编译器非常清晰,否则可能会进行大量不必要的复制。
{
vector<vector<int>> matrix(kolumny);
声明vector
vector
个vector
的外部kolumny
大小为vector
。没有分配内部 matrix = vector<vector<int>>(matrix1.size());
,因此2D操作注定失败。
vector
制作一个vector
vector
个临时matrix1
,其外部matrix
的大小与matrix
的外部向量相匹配。然后将该临时向量分配给刚刚创建的 for (int i = 0; i < kolumny; ++i)
for (int j = 0; i < (static_cast<signed int>(matrix1.size())); ++i)
,替换它的当前内容,然后销毁。 i
仍然没有分配内部向量,因此2D操作仍然注定失败。
j
static_cast
和for
永远不应该是负数(如果它们存在巨大的逻辑问题),那么使用无符号类型。使用正确的无符号类型,i
毫无意义。
此外,内部j
循环会增加并测试 matrix[i][j] = matrix1[i][j] + matrix2[i][j];
,而非matrix
j
除了 return matrix;
}
没有vector<vector<int>> AsumB(const vector<vector<int>> & matrix1,
const vector<vector<int>> & matrix2)
索引之外,我认为没有错。这将导致Undefined Behaviour访问超出范围。
vector<vector<int>>
清理它以使其在逻辑上合理:
vector
我们不需要列数。矢量已经知道所涉及的所有尺寸。但需要注意的是:const
允许所有内部{
size_t row = matrix1.size();
的不同大小。不要这样做,你应该做得很好。
接下来,此函数现在通过常量引用获取参数。使用引用时,不会复制。使用size_t
,编译器知道不会更改向量的内容,并且可以防止错误并进行一系列优化。
if (!(row > 0 && row == matrix2.size()))
{
return vector<vector<int>>();
}
vector
是一种无符号数据类型,保证足够大,可以索引任何可表示的对象。这将是足够的,你不必担心讨厌的否定数字。同时也不需要任何铸造。
size_t column = matrix1[0].size();
if (!(column > 0 && column == matrix2[0].size()))
{
return vector<vector<int>>();
}
在这里,我们确保每个人都同意他们的行数,如果他们没有,则返回空 vector<vector<int>> matrix(row, vector<int>(column));
。你也可以抛出异常。例外可能是更好的解决方案,但我不知道用例。
vector<int>(column)
与上述相同,但确保列数有意义。
row
按列矩阵创建本地行以存储结果。注意第二个参数。 vector
告诉编译器,所有column
内部向量都将初始化为 for (int i = 0; i < row; ++i)
{
for (int j = 0; j < column; ++j)
{
大小为 matrix[i][j] = matrix1[i][j] + matrix2[i][j];
}
}
return matrix;
。
vector<vector<int>> AsumB(const vector<vector<int>> & matrix1,
const vector<vector<int>> & matrix2)
{
size_t row = matrix1.size();
if (!(row > 0 && row == matrix2.size()))
{
return vector<vector<int>>();
}
size_t column = matrix1[0].size();
if (!(column > 0 && column == matrix2[0].size()))
{
return vector<vector<int>>();
}
vector<vector<int>> matrix(row, vector<int>(column));
for (int i = 0; i < row; ++i)
{
for (int j = 0; j < column; ++j)
{
matrix[i][j] = matrix1[i][j] + matrix2[i][j];
}
}
return matrix;
}
这里我们简化了循环,因为我们知道所有尺寸。
class Example extends React.Component {
constructor() {
super();
this.state = { user: {} };
this.onSubmit = this.handleSubmit.bind(this);
}
handleSubmit(e) {
e.preventDefault();
var self = this;
fetch('http://reqres.in/api/users', {
method: 'POST',
data: {
name: self.refs.name,
job: self.refs.job
}
})
.then(function(response) {
return response.json()
}).then(function(body) {
console.log(body);
});
}
render() {
return (
<form onSubmit={this.onSubmit}>
<input type="text" placeholder="Name" ref="name"/>
<input type="text" placeholder="Job" ref="job"/>
<input type="submit" />
</form>
);
}
}
ReactDOM.render(<Example/>, document.getElementById('View'));
编译器有许多技巧可以在返回时消除复制矩阵。如果您想了解更多信息,请使用您首选的网络搜索引擎查找返回值优化。 }
所有在一起:
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.0/react-dom.min.js"></script>
<div id="View"></div>