pgvector support for C++
25
stars
316
commits
C++
primary language
Jul 18, 2026
updated
pgvector support for C++
Supports libpqxx
Add the headers to your project (supports C++20 and greater).
There is also support for CMake and FetchContent:
include(FetchContent)
FetchContent_Declare(pgvector GIT_REPOSITORY https://github.com/pgvector/pgvector-cpp.git GIT_TAG v0.3.0)
FetchContent_MakeAvailable(pgvector)
target_link_libraries(app PRIVATE pgvector::pgvector)
Follow the instructions for your database library:
Or check out some examples:
COPYInclude the header
#include <pgvector/pqxx.hpp>
The latest version works libpqxx 8. For libpqxx 7, use version 0.2.4 and this readme.
Enable the extension
tx.exec("CREATE EXTENSION IF NOT EXISTS vector");
Create a table
tx.exec("CREATE TABLE items (id bigserial PRIMARY KEY, embedding vector(3))");
Insert a vector
pgvector::Vector embedding{{1, 2, 3}};
tx.exec("INSERT INTO items (embedding) VALUES ($1)", {embedding});
Get the nearest neighbors
pqxx::result r = tx.exec("SELECT * FROM items ORDER BY embedding <-> $1 LIMIT 5", {embedding});
Retrieve a vector
pqxx::row row = tx.exec("SELECT embedding FROM items LIMIT 1").one_row();
auto embedding = row[0].as<pgvector::Vector>();
Use std::optional<pgvector::Vector> if the value could be NULL
Create a vector from a std::vector
pgvector::Vector vec{std::vector<float>{1, 2, 3}};
Or a span
pgvector::Vector vec{std::span<const float>{{1, 2, 3}}};
Get a std::vector
const std::vector<float>& values = vec.values();
Create a half vector from a std::vector
pgvector::HalfVector vec{std::vector<pgvector::Half>{1, 2, 3}};
Note: pgvector::Half is std::float16_t or _Float16 when available, or float otherwise
Or a span
pgvector::HalfVector vec{std::span<const pgvector::Half>{{1, 2, 3}}};
Get a std::vector
const std::vector<pgvector::Half>& values = vec.values();
Create a sparse vector from a std::vector
pgvector::SparseVector vec{std::vector<float>{1, 0, 2, 0, 3, 0}};
Or a span
pgvector::SparseVector vec{std::span<const float>{{1, 0, 2, 0, 3, 0}}};
Or a map of non-zero elements
std::unordered_map<int, float> map{{0, 1}, {2, 2}, {4, 3}};
pgvector::SparseVector vec{map, 6};
Note: Indices start at 0
Get the number of dimensions
int dim = vec.dimensions();
Get the indices of non-zero elements
const std::vector<int>& indices = vec.indices();
Get the values of non-zero elements
const std::vector<float>& values = vec.values();
View the changelog
Everyone is encouraged to help improve this project. Here are a few ways you can help:
To get started with development:
git clone https://github.com/pgvector/pgvector-cpp.git
cd pgvector-cpp
createdb pgvector_cpp_test
cmake -S . -B build -DBUILD_TESTING=ON
cmake --build build
build/test
To run an example:
cd examples/loading
createdb pgvector_example
cmake -S . -B build
cmake --build build
build/example
C++
97.3%
CMake
2.7%
pgvector support for C++
25
stars
316
commits
C++
primary language
Jul 18, 2026
updated
pgvector support for C++
Supports libpqxx
Add the headers to your project (supports C++20 and greater).
There is also support for CMake and FetchContent:
include(FetchContent)
FetchContent_Declare(pgvector GIT_REPOSITORY https://github.com/pgvector/pgvector-cpp.git GIT_TAG v0.3.0)
FetchContent_MakeAvailable(pgvector)
target_link_libraries(app PRIVATE pgvector::pgvector)
Follow the instructions for your database library:
Or check out some examples:
COPYInclude the header
#include <pgvector/pqxx.hpp>
The latest version works libpqxx 8. For libpqxx 7, use version 0.2.4 and this readme.
Enable the extension
tx.exec("CREATE EXTENSION IF NOT EXISTS vector");
Create a table
tx.exec("CREATE TABLE items (id bigserial PRIMARY KEY, embedding vector(3))");
Insert a vector
pgvector::Vector embedding{{1, 2, 3}};
tx.exec("INSERT INTO items (embedding) VALUES ($1)", {embedding});
Get the nearest neighbors
pqxx::result r = tx.exec("SELECT * FROM items ORDER BY embedding <-> $1 LIMIT 5", {embedding});
Retrieve a vector
pqxx::row row = tx.exec("SELECT embedding FROM items LIMIT 1").one_row();
auto embedding = row[0].as<pgvector::Vector>();
Use std::optional<pgvector::Vector> if the value could be NULL
Create a vector from a std::vector
pgvector::Vector vec{std::vector<float>{1, 2, 3}};
Or a span
pgvector::Vector vec{std::span<const float>{{1, 2, 3}}};
Get a std::vector
const std::vector<float>& values = vec.values();
Create a half vector from a std::vector
pgvector::HalfVector vec{std::vector<pgvector::Half>{1, 2, 3}};
Note: pgvector::Half is std::float16_t or _Float16 when available, or float otherwise
Or a span
pgvector::HalfVector vec{std::span<const pgvector::Half>{{1, 2, 3}}};
Get a std::vector
const std::vector<pgvector::Half>& values = vec.values();
Create a sparse vector from a std::vector
pgvector::SparseVector vec{std::vector<float>{1, 0, 2, 0, 3, 0}};
Or a span
pgvector::SparseVector vec{std::span<const float>{{1, 0, 2, 0, 3, 0}}};
Or a map of non-zero elements
std::unordered_map<int, float> map{{0, 1}, {2, 2}, {4, 3}};
pgvector::SparseVector vec{map, 6};
Note: Indices start at 0
Get the number of dimensions
int dim = vec.dimensions();
Get the indices of non-zero elements
const std::vector<int>& indices = vec.indices();
Get the values of non-zero elements
const std::vector<float>& values = vec.values();
View the changelog
Everyone is encouraged to help improve this project. Here are a few ways you can help:
To get started with development:
git clone https://github.com/pgvector/pgvector-cpp.git
cd pgvector-cpp
createdb pgvector_cpp_test
cmake -S . -B build -DBUILD_TESTING=ON
cmake --build build
build/test
To run an example:
cd examples/loading
createdb pgvector_example
cmake -S . -B build
cmake --build build
build/example
C++
97.3%
CMake
2.7%