假设我有两个向量
auto a = std::vector<int>{10, 11, 12, 13, 14, 15};
auto b = std::vector<int>{21, 22, 23};
,我想把b
的全部内容复制到a
中,从某个位置开始(假设是4
),可能会覆盖元素并调整向量的大小,这样得到的向量a
看起来像
[10, 11, 12, 13, 21, 22, 23]
是否有一些功能在STL(可能在<algorithm>
或'),正是这样做?
借助c++ 20<ranges>
auto a = std::vector{10, 11, 12, 13, 14, 15};
auto b = std::vector{21, 22, 23};
auto pos = 4;
auto c = a | std::views::drop(pos);
auto sz = c.size();
std::ranges::copy(b | std::views::take(sz), c.begin());
std::ranges::copy(b | std::views::drop(sz), std::back_inserter(a));
演示你可以这样做:
auto a = std::vector<int>{ 10, 11, 12, 13, 14, 15 };
auto b = std::vector<int>{ 21, 22, 23 };
int from = 4; //from which index
a.insert(a.begin() + from, b.begin(), b.end());
a.resize(from + b.size());
for (auto i : a) {
std::cout << i << " ";
}
没有现成的算法可以做到这一点。你可以像这样自己实现它:
auto a = std::vector<int>{10, 11, 12, 13, 14, 15};
auto b = std::vector<int>{21, 22, 23};
std::size_t insertionPoint = 4;
std::size_t elemCount = std::max(insertionPoint + b.size(), a.size());
a.resize(elemCount);
std::copy(std::cbegin(b), std::cend(b), std::begin(a) + insertionPoint);
注意:
- 这要求
std::vector
的值类型(即,在本例中,int
)是默认可构造的。 - 如果
insertionPoint
大于a.size()
,则在a
的最后一个元素(插入之前)和b
的第一个插入元素之间获得默认构造元素。