Trong chương trình C++ STL sau, tôi định nghĩa hàm functor Nth và nó trả về true nếu nó bị thu hồi trong lần thứ n.Và tôi chuyển nó thành thuật toán chung remove_if, lạ.Chương trình C++ STL sử dụng hàm functor làm vị ngữ
Mã:
#include <iostream>
#include <list>
#include <algorithm>
#include "print.hpp"
using namespace std;
class Nth{
private:
int nth,ncount;
public:
Nth(int n):nth(n),ncount(0){}
bool operator()(int)
{
return ++ncount == nth;
}
};
int main()
{
list<int> col;
for (int i = 1;i <=9 ;++i)
{
col.push_back(i);
}
PRINT_ELEMENTS(col,"col : ");
list<int>::iterator pos;
pos = remove_if(col.begin(),col.end(),
Nth(3));
col.erase(pos,col.end());
PRINT_ELEMENTS(col,"nth removed : ");
}
print.hpp:
#include <iostream>
template <class T>
inline void PRINT_ELEMENTS (const T& coll, const char* optcstr="")
{
typename T::const_iterator pos;
std::cout << optcstr;
for (pos=coll.begin(); pos!=coll.end(); ++pos) {
std::cout << *pos << ' ';
}
std::cout << std::endl;
}
tôi chạy nó trong Microsoft Visual Studio 2008 và tôi nhận được kết quả: Nó xóa các yếu tố 3 và 6 mà không phải là tôi muốn. Tôi nghĩ rằng chỉ có 3 sẽ bị xóa. Ai đó có thể giải thích cho tôi? Cảm ơn rất nhiều.
Để chính xác hơn, những gì mà OP mong muốn đạt được vẫn có thể thực hiện được. Trạng thái phải được chuyển sang bên ngoài và được chuyển đến vị từ dưới dạng tham chiếu có thể thay đổi. Sau đó tất cả các bản sao của một vị từ đã cho sẽ chia sẻ cùng một trạng thái có thể thay đổi so với bản gốc. –