当前试图获取名称(字符串)的向量以反向打印。不会使用反向功能,因此将“手动完成”。到目前为止,我所拥有的矢量都可以向前很好地打印,但是在向后打印时,它可以向后打印前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;
}
}
答案 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));