c++ vector = {vec1.begin,vec1.begin}返回空向量

3pmvbmvn  于 2023-10-21  发布在  其他
关注(0)|答案(1)|浏览(87)

我在试图理解创建另一个向量的子向量的行为。
例如,这段代码:https://godbolt.org/z/PYG34vnTr有一个2元素向量vec1。我想创建第一个元素的向量。为了让它工作,我不得不使用:用途:

std::vector<int> vec2 = {vec1.begin(), vec1.begin() + 1};

我在试着理解为什么要这么做。原因是,我在做一个递归循环,在每次迭代中将向量减半。公式是:

std::vector<int> vec2 = {vec1.begin(), vec1.begin() + (vec1.size()-1)/2};

适用于除vec1为2元素向量的迭代之外的所有迭代。
我应该使用什么替代代码?

rta7y2nd

rta7y2nd1#

结束迭代器需要比你想要的最后一个元素多一个元素,这意味着必须删除-1
插图:

#include <iostream>
#include <vector>

void foo(std::vector<int> inp) {
    for (auto v : inp) std::cout << ' ' << v;
    std::cout << '\n';

    if (inp.size() > 1) {
        // the midpoint:
        auto mid = inp.begin() + inp.size() / 2;

        std::cout << "L:";
        foo({inp.begin(), mid});

        std::cout << "R:";
        foo({mid, inp.end()});
    }
}

int main() {
    std::vector<int> vec1{1, 2, 3, 4};
    std::cout << "X:";
    foo(vec1);
    std::cout << "Done\n";
}

输出量:

X: 1 2 3 4
L: 1 2
L: 1
R: 2
R: 3 4
L: 3
R: 4
Done

Demo
一个非复制的版本,只使用迭代器可以看起来像这样,并给出相同的结果:

template<class It>
void foo(It first, It last) {
    for(auto curr = first; curr != last; ++curr) std::cout << ' ' << *curr;
    std::cout << '\n';
    auto size = std::distance(first, last);

    if (size > 1) {
        auto mid = first + size / 2;
        std::cout << "L:";
        foo(first, mid);
        std::cout << "R:";
        foo(mid, last);
    }
}

Demo

相关问题