gpt4 book ai didi

c++ - 如何访问具有交替索引的 2 个 cpp vector ?

转载 作者:行者123 更新时间:2023-11-28 01:51:04 24 4
gpt4 key购买 nike

我如何改进这段代码,以便我可以使用迭代器而不是索引访问?

当前的实现并不安全,因为我可能会越界访问 vector a,当然我可以在调用 at 方法之前先检查 vector 大小,但是我很想知道更好的代码,比如使用 for_each 或其他现代 cpp 或 lambda 表达式?

std::vector<int> a = { 1, 2, 3 };
std::vector<int> b = { 2, 1 };
std::vector<double> result;

for (int i = 0; i < b.size(); i++) {
int current = a.at(i);
int next = a.at(i + 1);

double average = (current + next) / static_cast<double>(b.at(i));
result.push_back(average);
}

最佳答案

根据迭代器实现算法最像 STL,并将产生高效的代码。

它还具有描述算法而不是容器的优点,因此它是通用的。

#include <vector>
#include <cassert>
#include <iostream>
#include <iterator>

template<class Iter1, class Iter2, class OutIter>
void compute_splits(Iter1 first1, Iter1 last1,
Iter2 first2, Iter2 last2,
OutIter dest) {
using t1 = typename std::iterator_traits<Iter1>::value_type;
using t2 = typename std::iterator_traits<Iter2>::value_type;
using tt = std::common_type_t<t1, t2>;

// check preconditions
auto valid = std::distance(first1, last1) == (1 + std::distance(first2, last2));
assert(valid);

while (first2 != last2) {
tt tot = *first1 + *std::next(first1);
tot /= *first2;
*dest = tot;
++first1;
++first2;
++dest;
}
}

int main() {
std::vector<int> a = {1, 2, 3};
std::vector<double> b = {2, 1};
std::vector<double> result;

compute_splits(a.begin(), a.end(), b.begin(), b.end(), std::back_inserter(result));

std::copy(result.begin(), result.end(), std::ostream_iterator<double>(std::cout, ", "));
std::cout << std::endl;
}

预期输出:

1.5, 5, 

关于c++ - 如何访问具有交替索引的 2 个 cpp vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43016767/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com