不同编译器的不同结果 C++(矢量复制)
Different results on different compilers c++(vector copying)
我需要为每月任务实施一个简单版本的时间表。比如支付电费,通讯订阅费等。我想实现如下一组操作:
ADD(i,s) - 将名称为 s 的个案分配给当月的第 i 天。
DUMP(i) - 显示为当月第 i 天安排的所有任务。
下一步 - 转到新月份的待办事项列表。执行此命令时,将创建下个月的(新)待办事项列表,而不是当前月份的当前(旧)待办事项列表,并激活:旧待办事项列表中的所有任务都是复制到新列表。执行该命令后,新的待办事项和下个月变成当前月份,旧的待办事项停止工作。移动到新的月份时,需要注意月份天数的不同:
如果下个月的天数多于当前的天数,则“额外”天数必须留空(不包含个案);
如果下个月的天数少于当前月份,则所有“额外”天数的个案必须移至下个月的最后一天。
这是我的代码:
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;
int main(){
//q - number of operations.
//day - on which day to plan operation.
//to_do - what exactly to do on some day.
//operation - which kind of operation to perform.
const vector<int>day_mon = {31,28,31,30,31,30,31,31,30,31,30,31};
//m_ind - month index
int c_ind = 0;
int n_ind = 0;
int q,day;
int days_diff;
string operation;
string to_do;
//vector of the current month and next month
vector<vector<string> > current_month(31);
vector<vector<string> > next_month;
cin >> q;
//for q operations:
for(int i = 0;i< q;i++){
cin >> operation;
if(operation == "NEXT"){
//change next_month index
if(c_ind == 11){
n_ind = 0;
} else{
n_ind +=1;
}
next_month.resize(day_mon[n_ind]);
copy(current_month.begin(),current_month.begin() + day_mon[n_ind],next_month.begin());
days_diff = day_mon[c_ind] - day_mon[n_ind];
//if next month has less days as current month, write days into the last day
//of the next months
if(days_diff > 0){
for(int i = 0; i < days_diff;i++){
next_month[day_mon[n_ind]-1].insert(end(next_month[day_mon[n_ind]-1]), begin(current_month[day_mon[n_ind]+i]), end(current_month[day_mon[n_ind]+i]));
}
}
current_month.clear();
c_ind +=1;
current_month.resize(next_month.size());
current_month = next_month;
next_month.clear();
} else if(operation == "ADD"){
cin >> day >> to_do;
current_month[day-1].push_back(to_do);
} else if(operation == "DUMP"){
cin >> day;
cout << current_month[day-1].size() << ' ';
for(int i = 0; i < current_month[day-1].size(); i++){
cout << current_month[day-1][i] << ' ';
}
cout << endl;
}
}
return 0;
}
我已经通过以下输入测试了程序:
12
ADD 5 Salary
ADD 31 Walk
ADD 30 WalkPreparations
NEXT
DUMP 5
DUMP 28
NEXT
DUMP 31
DUMP 30
DUMP 28
ADD 28 Payment
DUMP 28
在我的编译器上我得到了正确的结果:
1 Salary
2 WalkPreparations Walk
0
0
2 WalkPreparations Walk
3 WalkPreparations Walk Payment
但在其他编译器上我热错了结果:
1 Salary
2 WalkPreparations Walk
1 Salary
1
2 WalkPreparations Walk
3 WalkPreparations Walk Payment
你能帮我找出错误吗?
看这里
copy(current_month.begin(), current_month.begin() + day_mon[n_ind], next_month.begin());
当 current_month 有 28 天而下个月有 31 天时会发生什么 - 即 day_mon[n_ind] = 31
如前所述,这一行:
copy(current_month.begin(), current_month.begin() + day_mon[n_ind], next_month.begin());
假设 current_month
至少有 day_mon[n_ind]
天,但情况并非如此,例如 current_month
有 28 天(2 月),但下个月(三月)有 31 天(day_mon[n_ind]
将是 31 天)。
解决此问题的一种方法是将 copy
限制为当前月份和下个月的天数中的最小值:
size_t numElementsToCopy = std::min(current_month.size(), static_cast<size_t>(day_mon[n_ind]));
std::copy_n(current_month.begin(), numElementsToCopy, next_month.begin());
注意:在这种情况下,使用 std::copy_n
比使用 std::copy
更简洁。
我需要为每月任务实施一个简单版本的时间表。比如支付电费,通讯订阅费等。我想实现如下一组操作:
ADD(i,s) - 将名称为 s 的个案分配给当月的第 i 天。
DUMP(i) - 显示为当月第 i 天安排的所有任务。
下一步 - 转到新月份的待办事项列表。执行此命令时,将创建下个月的(新)待办事项列表,而不是当前月份的当前(旧)待办事项列表,并激活:旧待办事项列表中的所有任务都是复制到新列表。执行该命令后,新的待办事项和下个月变成当前月份,旧的待办事项停止工作。移动到新的月份时,需要注意月份天数的不同:
如果下个月的天数多于当前的天数,则“额外”天数必须留空(不包含个案);
如果下个月的天数少于当前月份,则所有“额外”天数的个案必须移至下个月的最后一天。
这是我的代码:
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;
int main(){
//q - number of operations.
//day - on which day to plan operation.
//to_do - what exactly to do on some day.
//operation - which kind of operation to perform.
const vector<int>day_mon = {31,28,31,30,31,30,31,31,30,31,30,31};
//m_ind - month index
int c_ind = 0;
int n_ind = 0;
int q,day;
int days_diff;
string operation;
string to_do;
//vector of the current month and next month
vector<vector<string> > current_month(31);
vector<vector<string> > next_month;
cin >> q;
//for q operations:
for(int i = 0;i< q;i++){
cin >> operation;
if(operation == "NEXT"){
//change next_month index
if(c_ind == 11){
n_ind = 0;
} else{
n_ind +=1;
}
next_month.resize(day_mon[n_ind]);
copy(current_month.begin(),current_month.begin() + day_mon[n_ind],next_month.begin());
days_diff = day_mon[c_ind] - day_mon[n_ind];
//if next month has less days as current month, write days into the last day
//of the next months
if(days_diff > 0){
for(int i = 0; i < days_diff;i++){
next_month[day_mon[n_ind]-1].insert(end(next_month[day_mon[n_ind]-1]), begin(current_month[day_mon[n_ind]+i]), end(current_month[day_mon[n_ind]+i]));
}
}
current_month.clear();
c_ind +=1;
current_month.resize(next_month.size());
current_month = next_month;
next_month.clear();
} else if(operation == "ADD"){
cin >> day >> to_do;
current_month[day-1].push_back(to_do);
} else if(operation == "DUMP"){
cin >> day;
cout << current_month[day-1].size() << ' ';
for(int i = 0; i < current_month[day-1].size(); i++){
cout << current_month[day-1][i] << ' ';
}
cout << endl;
}
}
return 0;
}
我已经通过以下输入测试了程序:
12
ADD 5 Salary
ADD 31 Walk
ADD 30 WalkPreparations
NEXT
DUMP 5
DUMP 28
NEXT
DUMP 31
DUMP 30
DUMP 28
ADD 28 Payment
DUMP 28
在我的编译器上我得到了正确的结果:
1 Salary
2 WalkPreparations Walk
0
0
2 WalkPreparations Walk
3 WalkPreparations Walk Payment
但在其他编译器上我热错了结果:
1 Salary
2 WalkPreparations Walk
1 Salary
1
2 WalkPreparations Walk
3 WalkPreparations Walk Payment
你能帮我找出错误吗?
看这里
copy(current_month.begin(), current_month.begin() + day_mon[n_ind], next_month.begin());
当 current_month 有 28 天而下个月有 31 天时会发生什么 - 即 day_mon[n_ind] = 31
如前所述,这一行:
copy(current_month.begin(), current_month.begin() + day_mon[n_ind], next_month.begin());
假设 current_month
至少有 day_mon[n_ind]
天,但情况并非如此,例如 current_month
有 28 天(2 月),但下个月(三月)有 31 天(day_mon[n_ind]
将是 31 天)。
解决此问题的一种方法是将 copy
限制为当前月份和下个月的天数中的最小值:
size_t numElementsToCopy = std::min(current_month.size(), static_cast<size_t>(day_mon[n_ind]));
std::copy_n(current_month.begin(), numElementsToCopy, next_month.begin());
注意:在这种情况下,使用 std::copy_n
比使用 std::copy
更简洁。