本当にのポインターが必要な場合は、 のようなスマート ポインターstd::vector
の使用を検討することをお勧めします。生のポインターは、ポインターを監視している場合は問題ありませんが、通常は生の所有ポインターを使用しないでください (特別な条件がない限り)。std::shared_ptr
ラムダをstd::lower_bound()
に渡して、並べ替え基準を指定できます (この場合、主要なデータ メンバーを比較します)。
std::vector<std::shared_ptr<A>>::iterator
さらに、の戻り値を明示的に記述する代わりに、std::lower_bound()
C++11 のキーワードを使用することもできますauto
。これにより、この場合、コードが読みやすくなります。
コンパイル可能なコード サンプルは次のとおりです (g++ 4.8.0 でコンパイル)。
#include <algorithm> // for std::lower_bound
#include <iostream> // for console output
#include <memory> // for std::make_shared, std::shared_ptr
#include <string> // for std::string
#include <vector> // for std::vector
using namespace std;
// Test data structure
struct A
{
int Key;
string Data;
A()
: Key(0)
{}
A(int key, const string& data)
: Key(key), Data(data)
{}
};
ostream& operator<<(ostream& os, const A& a)
{
os << "(key=" << a.Key << ", data=\"" << a.Data << "\")";
return os;
}
void Print(const vector<shared_ptr<A>> & v)
{
cout << "[ ";
for (const auto & p : v)
{
cout << *p << " ";
}
cout << " ]\n";
}
int main()
{
// Test container
vector<shared_ptr<A>> v;
// Test data
const char* data[] = {
"hello",
"world",
"hi",
nullptr
};
// Index in data array
int i = 0;
// Insertion loop
while (data[i] != nullptr)
{
// Create new element on the heap
auto elem = make_shared<A>(i, data[i]);
// Find ordered insertion position
auto it = lower_bound(v.begin(), v.end(), elem,
[](const shared_ptr<A>& lhs, const shared_ptr<A>& rhs)
{
return lhs->Key < rhs->Key;
}
);
// Insert in vector
v.insert(it, elem);
// Move to next data
i++;
}
// Show the result
Print(v);
}
出力は次のとおりです。
[ (key=2, data="hi") (key=1, data="world") (key=0, data="hello") ]