2012年5月31日木曜日

整列した std::vector に挿入して、またアクセス備忘録

未だに、結構こういう、くだらない事を忘れてしまい。試すとか、よくあります。

#include <vector>
#include <iostream>
#include <algorithm>

int main() {
  std::vector<int> v;
  // 10, 20, ..., 90 と整列した配列に対して
  for( int i = 1; i < 10; ++i )  v.push_back( i * 10 );
  // 25 を挿入したい
  std::vector<int>::iterator f = std::lower_bound( v.begin(), v.end(), 25 );
  // 挿入する位置は、わかったが、後からアクセスする場合に備えて
  // 場所を覚えておきたい
  int pos = std::distance( v.begin(), f );
  // とりあえず挿入
  v.insert( f, 25 );
  // 挿入された位置は、ここですよ
  std::cout << pos << std::endl;
  // ほんまかいな?
  std::cout << v[ pos ] << std::endl;
  // ちゃんと並んでますか?
  for( int i = 0; i < 10; ++i ) { std::cout << v[i] << ","; }
}

追記: コメントもらった。 C++11 だと、insert が 挿入位置を返すので単に
  f = v.insert( f, 25 );
で、OKのようです。

2012年5月18日金曜日

soci-3.1.0 on windows build 忘備録

SOCI 一部、boost::geometry のサンプルにも使われています。SQL-Client 接続のライブラリです。 個別のライブラリでゴリゴリ書くのが、だんだんと面倒くさくなってきたし、ビルドが cmake に移行してきたので、コンパイルに挑戦してみようかなぁと。  まず、soci-3.1.0 ディレクトリに移動して、
C:\Downloads\soci-3.1.0> mkdir build
と、build ディレクトリを作成します。 今回は、sqlite3, postgresql, odbc をターゲットに構築してみました。sqlite3 や postgresql のライブラリの構築は、ここでは扱いません。 以下のような build.bat を作成しました。
cd build
cmake .. -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release ^
  -DWITH_SQLITE3=ON ^
  -DSQLITE3_INCLUDE_DIR=c:/libs/sqlite3/include ^
  -DSQLITE3_LIBRARIES=c:/libs/sqlite3/lib ^
  -DSQLITE3_LIBRARY=c:/libs/sqlite3/lib/sqlite3.lib ^
  -DSQLITE_INCLUDE_DIR=c:/libs/sqlite3/include ^
  -DSQLITE_LIBRARIES=c:/libs/sqlite3/lib ^
  -DSQLITE_LIBRARY=c:/libs/sqlite3/lib/sqlite3.lib ^
  -DWITH_ODBC=ON ^
  -DWITH_POSTGRESQL=ON ^
  -DPOSTGRESQL_INCLUDE_DIR=C:/libs/postgres/include ^
  -DPOSTGRESQL_LIBRARIES=C:/libs/postgres/lib/libpq.lib ^
  -DBOOST_RELEASE_VERSION=1.49.0 ^
  -DBOOST_INCLUDE_DIR=C:/downloads/boost-1_49_0 ^
  -DBOOST_LIBRARIES=C:/downloads/boost-1_49_0/stage/lib
cd ..
変な ^ マークは、バッチファイルを複数行連結させる時のおまじないです。linux 系では \ に相当します。
ドキュメントには、SQLITE_INCLUDE_DIR, SQLITE_LIBRARIES を設定しろと書いていますが、間違ってます。
SQLITE3_INCLUDE_DIR が正しく、同様に SQLITE3_LIBRARIES かと思いきや CMakeFiles.txt 中で SQLITE3_LIBRARY から SQLITE3_LIBRARIES が思い切り上書きされています。ですので、SQLITE3_LIBRARY に sqlite3 の libディレクトリファイルを指定します。
postgresql も libpq.lib を指定します。

初期ポストで、ここに示していた修正は間違っていたので消去しました


windows だと、リンクに失敗しますので、soci-3.1.0/backends/soci-postgresql.h を修正します。
...
#ifndef SOCI_POSTGRESQL_H_INCLUDED
#define SOCI_POSTGRESQL_H_INCLUDED

#ifdef _WIN32
# ifdef SOCI_DLL
#  ifdef SOCI_POSTGRESQL_SOURCE
#   define SOCI_POSTGRESQL_DECL __declspec(dllexport)
#  else
#   define SOCI_POSTGRESQL_DECL __declspec(dllimport)
#  endif // SOCI_POSTGRESQL_SOURCE
# endif // SOCI_DLL
// ここの2行を追加します。
#pragma comment( lib, "ws2_32.lib")
#pragma comment( lib, "secur32.lib")
#endif // _WIN32
//
// If SOCI_POSTGRESQL_DECL isn't defined yet define it now
...
それでは、準備が整いましたので、soci-3.1.0 のディレクトリに移動して
C:\Downloads\soci-3.1.0> build
C:\Downloads\soci-3.1.0> cd build
C:\Downloads\soci-3.1.0\build> nmake
以上で完了です。 今回、spatialite は使用しませんでした。 インストールは、管理者権限で nmake install です。 2012/05/18 追記:どうも、うまくコンパイルできていないくさい・・・ backends/*/CMakelists.txt の変更が間違ってると思われるので削除。 2012/05/18 追記:修正して追記。 2012/05/18 追記:同じ所で、ひっかかった。http://www.mail-archive.com/soci-users@lists.sourceforge.net/msg00931.html 2012/05/18 追記:うーん・・・やっぱ、ゴリゴリ書くか・・・