我正在嘗試實作一種演算法,如果它們滿足 BinaryPredicate 則合并有序容器中的元素。
template <typename ForwardIt,
typename OutputIt,
typename BinaryPredicate,
typename Merge>
void merge_adjacent(ForwardIt first,
ForwardIt last,
OutputIt out,
BinaryPredicate pred,
Merge merge)
{
if(first != last)
*out = *(first );
while(first != last)
{
if(pred(*first, *out))
*out = merge(*out, *(first ));
else
*( out) = *(first );
}
}
當我通過一個空容器將結果放入(通過OutputIterator)時,我得到一個分段錯誤 - 我也明白為什么,因為容器沒有保留任何空間......當我在通過OutputIterator之前保留足夠的空間時,容器保持空...
我很困惑,因為我在 cppreference 上遵循 std::transform 函式的示例實作:
template< class InputIt,
class OutputIt,
class UnaryOperation >
OutputIt transform( InputIt first1,
InputIt last1,
OutputIt d_first,
UnaryOperation unary_op )
{
while (first1 != last1) {
*d_first = unary_op(*first1 );
}
return d_first;
}
我究竟做錯了什么?
我的 main.cpp 完整性:
#include "merge_adjacent.hpp"
#include <vector>
#include <iostream>
#include <stdexcept>
class Sale
{
public:
Sale(int date, double amount)
: date(date),
amount(amount)
{}
Sale()
: date(0),
amount(0)
{}
int getDate() const
{
return date;
}
double getAmount() const
{
return amount;
}
private:
int date;
double amount;
};
bool sameDate(Sale const& sale1, Sale const& sale2)
{
return sale1.getDate() == sale2.getDate();
}
Sale mergeSales(Sale const& sale1, Sale const& sale2)
{
if (sale1.getDate() != sale2.getDate()) throw ;
return Sale(sale1.getDate(), sale1.getAmount() sale2.getAmount());
}
int main()
{
std::vector<Sale> sales = {Sale{1,2.9}, Sale(1,2.2),Sale(1,4.7),Sale(2,1.9),Sale(3,3.8),Sale(3,1.1),Sale(5,2.9),Sale(6,2.9),Sale(6,2.9)};
std::vector<Sale> merged;
merged.reserve(20);
merge_adjacent(sales.begin(), sales.end(), merged.begin()/*std::back_inserter(merged)*/, sameDate, mergeSales);
std::cout << "size of merged must be 5: " << merged.size() << std::endl;
return 0;
}
uj5u.com熱心網友回復:
您可能正在尋找這樣的東西:
template <typename InputIt,
typename OutputIt,
typename BinaryPredicate,
typename Merge>
void merge_adjacent(InputIt first,
InputIt last,
OutputIt out,
BinaryPredicate pred,
Merge merge)
{
if (first == last) return;
auto accum = *first ;
while (first != last) {
auto cur = *first ;
if (pred(cur, accum)) {
accum = merge(accum, cur);
} else {
*out = accum;
accum = cur;
}
}
*out = accum;
}
演示。沒有經過非常徹底的測驗,我只確認它適用于您的示例。我認為我在InputIterator和OutputIterator的能力范圍內,但我也沒有測驗過。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/455264.html
上一篇:實作emplace_back()二進制“=”時出錯:未找到采用“T*”型別的右手運算元的運算子
下一篇:在c 中增加變數值時的競爭條件
