反转字符串向量而没有反转功能

时间:2019-11-14 08:45:18

标签: c++ string vector

当前试图获取名称(字符串)的向量以反向打印。不会使用反向功能,因此将“手动完成”。到目前为止,我所拥有的矢量都可以向前很好地打印,但是在向后打印时,它可以向后打印前4个字符串,然后又可以向前打印其余的字符串。一直坐在上面,只是想不出如何解决它。谢谢。

#include <iostream>
#include <vector>

int main() 
{  
    std::vector<std::string> names { "Jeff", "Jim", "Jerry", "Lisa",  "Terry", "Tim", "Tiff"};

    std::cout << "This is the vector printing forwards\n";
    for (int i = 0; i < names.size(); i++)
    {
        std::cout << names[i] << std::endl;
    }

    std::cout << "This is the vector printing backwards\n";
    for (int i = 0, j = names.size() - 1; i < names.size(); i++, j--)
    {
        std::string temp = names[i];
        names[i] = names[j];
        names[j] = temp;

        std::cout << names[i] << std::endl;
    }
}

4 个答案:

答案 0 :(得分:3)

这是因为您要为每个元素交换两次。

对于大小为4的向量:交换操作:

0 3
1 2
2 1
3 0

环绕向量的一半大小。

for (int i = 0, j = names.size() - 1; i < names.size()/2; i++, j--)
    {
        std::string temp = names[i];
        names[i] = names[j];
        names[j] = temp;
    }

使用另一个循环打印矢量。

for (int i = 0; i < names.size(); i++)
    {
        cout<<names[i]<<endl;
    }

答案 1 :(得分:0)

C ++最佳实践是不编写原始循环。

尽管如此,这是一个如何在索引的帮助下实现它的版本。

#include <iostream>
#include <vector>

int main() {
    std::vector<std::string> names{"Jeff",  "Jim", "Jerry", "Lisa",
                                   "Terry", "Tim", "Tiff"};

    std::cout << "This is the vector printing forwards\n";
    for (int i = 0; i < names.size(); i++) {
        std::cout << names[i] << std::endl;
    }

    std::cout << "This is the vector printing backwards\n";
    for (int i = names.size() - 1; i >= 0; i--) {
        std::cout << names[i] << std::endl;
    }
}

答案 2 :(得分:0)

您必须一直交换值直到向量大小的中间。

 cout << "This is the vector printing backwards\n";
    for (int i = 0, j = names.size() - 1; i < names.size(); i++, j--)
    {
        if(i < names.size()/2)
        {
            temp = names[i];
            names[i] = names[j];
            names[j] = temp;
        }
        cout << names[i] << endl;
    }

答案 3 :(得分:0)

最先迭代容器的方法是使用反向迭代器。这可以通过std :: for_each()函数来完成。 (前向循环也可以使用基于的范围来完成)

#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>

int main() 
{  
    std::vector<std::string> names { "Jeff", "Jim", "Jerry", "Lisa",  "Terry", "Tim", "Tiff"};

    std::cout << "This is the vector printing forwards\n";
    std::for_each(names.begin(), names.end(), [](const std::string& name)
    {
        std::cout << name << std::endl;
    });

    std::cout << "This is the vector printing backwards\n";
    std::for_each(names.rbegin(), names.rend(), [](const std::string& name)
    {
        std::cout << name << std::endl;
    });
}

如果您打算手动实际反转容器,则可以按照其他答案中已经提到的那样向上交换直到容器的一半。您还可以向后迭代原始容器,然后复制到新容器中,然后用新容器替换原始容器,但这已经接近使用std :: reverse()函数了,而且速度可能会更慢。

std::copy(names.rbegin(), names.rend(), std::back_inserter(newNames));