私は STL アルゴリズムを試していて、より具体的には for_each 関数を使っていました。文字列のベクトルを連結するための簡単な使用例を試しました。これはおそらく適切で効率的なコードではないことに注意してください。本当に文字列のベクトルを連結したい場合は、boost::algorithm::join 関数を見てください。
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include "concatenator.h"
using namespace std;
int main(int argc, char **argv) {
vector<string> list;
list.push_back("hello");
list.push_back("world");
list.push_back("!!!");
Concatenator concatenator;
for_each(list.begin(), list.end(), concatenator);
cout << "result = " << concatenator.getResult() << endl;
}
連結子クラスは、通常のファンクターとして実装されます。
concatenator.h:
#include <string>
class Concatenator {
public:
Concatenator();
virtual ~Concatenator();
void operator()(const std::string s);
std::string getResult();
private:
std::string fResult;
};
concatenator.cpp:
#include "concatenator.h"
#include <iostream>
Concatenator::Concatenator() :
fResult("") {
}
Concatenator::~Concatenator(){
std::cout << "concatenator destructor called " << std::endl;
}
void Concatenator::operator()(const std::string s) {
std::cout << "concat " << s << " to " << this->fResult << std::endl;
this->fResult += " " + s;
}
std::string Concatenator::getResult() {
return this->fResult;
}
このプログラムをコンパイルして実行すると、次の出力が得られます。
concat hello to
concat world to hello
concat !!! to hello world
concatenator destructor called
concatenator destructor called
result =
concatenator destructor called
ファンクタから正しい結果を抽出できない理由と、デストラクタが何度も呼び出される理由を誰かが説明できますか?