C++将向量插入到另一个覆盖向量中


vector <char> grid(10);
for (int temp1 = 0; temp1 < grid.size(); temp1++) {
grid[temp1] = 'g';
}
vector <char> ship(3);
for (int temp2 = 0; temp2 < ship.size(); temp2++) {
ship[temp2] = 's';
}
int location = 2;
void insertfunction(grid, ship, location) {
// what function code to write?
return grid 
}

假设我有两个矢量:栅格(长度10,"gggggggggg")和船("ss")。我想将向量船插入向量网格,并根据我选择的位置覆盖原始值。例如,如果位置是2,则我应该得到"2";ggsssggggg";如果位置是5;ggggg-sssgg";

我应该如何编写insert函数才能工作?

对不起,我是C++的新手

std::copy(ship.begin(), ship.end(), grid.begin() + offset);

这将覆盖图元。小心不要跑出界。

试试这个(包括健全性检查):

#include <iostream>
#include <vector>
void overwriteVectorWithOffset(std::vector<char> &target, std::vector<char> const &source, size_t offset)
{
size_t end = min(target.size(), source.size() + offset);
size_t i = 0;
while (offset < end)
target[offset++] = source[i++];
}
int main()
{
std::vector <char> grid(10, 'e');
std::vector <char> ship(3, 'f');
overwriteVectorWithOffset(grid, ship, 2);
for (size_t i = 0; i < grid.size(); ++i)
std::cout << grid[i];
std::cout << std::endl;
}

您可以对作业使用std::copy_n。您只需要将count设为[ship.begin(), ship.end()][grip.begin() + location, grip.end()]之间的最小距离。这将确保没有越界错误。

在代码中(BTW,只是假设位置是正的,否则,将需要进一步检查):

// Sanity check
auto offset = std::min(grid.begin() + location, grid.end());
// calculating count, as described above
auto grid_distance = std::distance(offset, grid.end());
auto ship_distance = std::distance(ship.begin(), ship.end());
auto count = std::min(grid_distance, ship_distance);
std::copy_n(ship.begin(), count, offset);
#include <iostream>
#include <algorithm>
#include <vector>
std::vector<char> grid(10, 'e');
std::vector<char> ship(3, 'f');
void InsertShip(int position)
{
if (position >= 0 && position < grid.size())
std::transform(ship.begin(), ship.end(), grid.begin() + position, 
[](const char& ch) { return ch; });
}
int main()
{
InsertShip(2);
for (const auto& ch : grid)
std::cout << ch;
getchar();
}

最新更新