#include <algorithm>
#include <iostream>
#include <numeric>
int main() {
std::cout << "Example 1: Concurrent push_back from multiple threads\n";
{
dispenso::parallel_for(0, 1000, [&vec](
size_t i) { vec.
push_back(
static_cast<int>(i)); });
std::cout <<
" Vector size after concurrent pushes: " << vec.
size() <<
"\n";
std::cout << " (Note: order may vary due to concurrent access)\n";
}
std::cout << "\nExample 2: grow_by for efficient batch insertion\n";
{
dispenso::parallel_for(0, 10, [&vec](size_t threadId) {
auto it = vec.
grow_by(100,
static_cast<double>(threadId));
(void)it;
});
std::cout <<
" Vector size: " << vec.
size() <<
" (expected: 1000)\n";
std::array<int, 10> counts = {0};
for (double val : vec) {
counts[static_cast<size_t>(val)]++;
}
std::cout << " Each thread's value appears 100 times: ";
std::cout << (std::all_of(counts.begin(), counts.end(), [](int c) { return c == 100; }) ? "yes"
: "no")
<< "\n";
}
std::cout << "\nExample 3: grow_by_generator with custom initialization\n";
{
int startValue = 0;
std::cout << " Generated values: ";
for (int val : vec) {
std::cout << val << " ";
}
std::cout << "\n";
}
std::cout << "\nExample 4: grow_to_at_least for minimum size guarantee\n";
{
dispenso::parallel_for(0, 10, [&vec](size_t i) {
size_t requiredSize = (i + 1) * 100;
});
std::cout <<
" Vector size: " << vec.
size() <<
" (at least 1000)\n";
}
std::cout << "\nExample 5: Reserving capacity for better performance\n";
{
std::cout <<
" Capacity after reserve: " << vec.
capacity() <<
"\n";
std::cout <<
" Size (still empty): " << vec.
size() <<
"\n";
dispenso::parallel_for(0, 5000, [&vec](
size_t i) { vec.
push_back(
static_cast<int>(i)); });
std::cout <<
" Size after pushes: " << vec.
size() <<
"\n";
}
std::cout << "\nExample 6: Iterator stability during concurrent modification\n";
{
int& firstElement = *it;
dispenso::parallel_for(0, 100, [&vec](
size_t i) { vec.
push_back(
static_cast<int>(i + 100)); });
std::cout << " First element via original iterator: " << *it << "\n";
std::cout << " First element via original reference: " << firstElement << "\n";
std::cout <<
" Vector size now: " << vec.
size() <<
"\n";
}
std::cout << "\nExample 7: Standard container operations\n";
{
std::cout << " Sorted: ";
for (int val : vec) {
std::cout << val << " ";
}
std::cout << "\n";
std::cout << " vec[2] = " << vec[2] << "\n";
std::cout <<
" front() = " << vec.
front() <<
", back() = " << vec.
back() <<
"\n";
}
std::cout << "\nExample 8: Copy and move semantics\n";
{
std::cout <<
" Original size: " << original.
size() <<
", Copy size: " << copied.
size() <<
"\n";
std::cout <<
" After move - Original size: " << original.
size()
<<
", Moved size: " << moved.
size() <<
"\n";
}
std::cout << "\nAll ConcurrentVector examples completed successfully!\n";
return 0;
}
iterator push_back(const T &val)
iterator grow_to_at_least(size_type n)
size_type capacity() const
iterator grow_by_generator(size_type delta, Gen gen)
iterator grow_by(size_type delta, const T &t)