[英]Sub-vector of 2D vector
我有std::vector<std::vector<double>> A(300, std::vector<double>(500))
。
我想創建一個子范圍為A
的新向量: sub-vector[5:10][25:100]
。 我怎樣才能做到這一點?
您可以使用迭代器。 首先創建向量:
std::vector<std::vector<double>> sub_vector;
sub_vector.reserve(5);
然后用向量的范圍構造函數填充它:
for (std::size_t i = 5; i < 10; ++i) {
sub_vector.emplace_back(A[i].begin() + 25, A[i].begin() + 100);
}
筆記:
您有責任確保索引在范圍內。 否則,這會導致未定義的行為。
這涉及封閉式范圍。 如果您想要近距離范圍,則需要在結束索引中添加 1。
沒有像這樣簡單的符號,你必須自己動手:
std::vector<std::vector<double>> A(300, std::vector<double>(500));
std::vector<std::vector<double>> subranges;
subranges.reserve(11 - 5);
std::transform(A.begin() + 5, A.begin() + 11,
std::back_inserter(subranges),
[](const auto& inner){ // [](const std::vector<double>& inner) {
return std::vector<double>(inner.begin() + 25,
inner.begin() + 101);
});
另一個解決方案
使用 function 來完成這項工作。
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
constexpr size_t MaxRows = 300;
constexpr size_t MaxColumns = 500;
using MyType = double;
using Columns = std::vector<MyType>;
using Matrix = std::vector<Columns>;
void copySubMatrix( const Matrix& source,Matrix& destination,const size_t& startRow,const size_t& endRow,const size_t& startColumn, const size_t& endColumn)
{
// Clear destination matrix
destination.clear();
// Copy rows end columns
std::for_each(source.begin() + startRow, source.begin() + endRow + 1, [&](const Columns & c) {
Columns row{ c.begin() + startColumn, c.begin() + endColumn + 1};
destination.push_back(row); });
}
int main() {
// Define source matrix with given size and empty destination matrix
Matrix A(MaxRows, Columns(MaxColumns));
Matrix result{};
// Fill source matrix with running values
std::for_each(A.begin(), A.end(), [i = 0](Columns & c) mutable {for (MyType& m : c) m = i++; });
// Copy the given range to the destination matrix
copySubMatrix(A, result, 5, 10, 25, 100);
// Display destination matrix
std::for_each(result.begin(), result.end(), [](const Columns & c) {
std::copy(c.begin(), c.end(), std::ostream_iterator<MyType>(std::cout, " ")); std::cout << "\n"; });
return 0;
}
您可以通過迭代一維來做到這一點:
std::vector<vector<double>> main_vector(300, std::vector<double>(500));
std::vector<vector<double>> sub_vector;
std::vector<double>::const_iterator first, last;
unsigned int x_pos_start=5, x_pos_end=10;
unsigned int y_pos_start=25, y_pos_end=100;
sub_vector.resize(x_pos_end - x_pos_start + 1);
for(size_t i=x_pos_start; i<=x_pos_end; ++i)
{
first = main_vector[i].begin() + y_pos_start;
last = main_vector[i].begin() + y_pos_end;
sub_vector[i].insert(sub_vector[i].begin(), first, last);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.