向后打印字符串向量

时间:2013-05-08 19:54:48

标签: c++

我正在尝试编写一个接受用户输入的程序,将其存储到字符串向量中,并根据函数打印出向量。

对于这个函数,“display_backwards”,它应该以类似镜像的图像显示用户的输入。

我在编写代码时遇到了麻烦,它给了我错误,我不明白为什么

这是我的代码:

void asci_art::display_backwards(vector<string> art)
{
char swap[100];
cout << "Your Artwork in mirrored image" << endl;
cout    << "=============================" <<endl;

for (unsigned int i=0; i < art.size(); i++)
{
    for(int j=0; j < art[i].size(); j++)
    {

        swap[j] = art[i].end()-j;
        art[i].begin()+j = swap[j];
    }
}

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

}

该函数写在类

矢量art是用户输入的。并且对于向量的每个元素,它存储一行字符串 我想要做的是访问元素的字符串并交换字符串的字母,我相信这将创建一个镜像图像。

我得到编译错误,例如“无法将_normal iterator&gt;转换为char”,我不明白为什么因为我正在处理相同类型的字符。 “没有像'='这样的操作?”

不明白为什么。谁能解释一下?或者我的逻辑可能是错的,有人可以帮我重写吗?

和我一起,我在C ++中并不是那么棒。我很感激帮助。

编辑:抱歉。忘了提我想让它反射/垂直镜像

3 个答案:

答案 0 :(得分:3)

使用std::reverse撤消vector中的每个字符串。

void asci_art::display_backwards(vector<string> art)
{
  for( auto&& a : art ) {
    std::reverse(a.begin(), a.end()); // reverses each string
    std::cout << a << std::endl;
  }
}

或者如果你想颠倒向量中字符串的顺序,那么稍微不同的反向调用就可以了。

void asci_art::display_backwards(vector<string> art)
{
  std::reverse( art.begin(), art.end() );  // reverses order of strings in vector
  for( auto const& a : art ) {
    std::cout << a << std::endl;
  }
}

答案 1 :(得分:0)

问题在于: 本领域[I] .begin()+ J =交换[j]的 你想做什么?将'swap [j]'分配给一个整数?

答案 2 :(得分:0)

在您的代码中,您混合使用直接数组访问和迭代器。 为了使您的代码按照需要工作,您需要决定其中一个。

第二件事是,您尝试存储反转的数组。由于您没有返回结果,因此您不需要这样做。您可以直接以相反的顺序输出数据。

示例:

// using direct access
void asci_art::display_backwards_direct(std::vector<std::string> art) {
  std::cout << "Your Artwork in mirrored image" << std::endl;
  std::cout << "=============================" <<std::endl;

  for (signed int i = art.size() - 1; i >= 0; --i) {
    std::cout << art[i]; // depending on your data you might need endl here
  }
  std::cout << std::endl;
}

// using iterators
void asci_art::display_backwards_iterators(std::vector<std::string> art) {
  std::cout << "Your Artwork in mirrored image" << std::endl;
  std::cout << "=============================" <<std::endl;

  for (std::vector<std::string>::iterator it = art.rbegin(); it != art.rend(); ++it) {
    std::cout << *it; // depending on your data you might need endl here
  }
  std::cout << std::endl;
}

// using direct access
void asci_art::display_backwards_direct_horizontal(std::vector<std::string> art) {
  std::cout << "Your Artwork in mirrored image" << std::endl;
  std::cout << "=============================" <<std::endl;

  for (signed int i = 0; i < art.size(); ++i) {
    std::cout << std::reverse(art[i].begin(), art[i].end()); // depending on your data you might need endl here
  }
  std::cout << std::endl;
}

// using iterators
void asci_art::display_backwards_iterators_horizontal(std::vector<std::string> art) {
  std::cout << "Your Artwork in mirrored image" << std::endl;
  std::cout << "=============================" <<std::endl;

  for (std::vector<std::string>::iterator it = art.begin(); it != art.end(); ++it) {
    std::cout << std::reverse(it->begin(), it->end()); // depending on your data you might need endl here
  }
  std::cout << std::endl;
}

C ++ 11语法会缩短第二个版本。

不相关:当你处理真正的向量时,使用引用传递参数可以加速应用程序,因此每次都不会复制向量。

void some_function(std::vector<std::string> const & const_reference_to_my_string_vector) {
  std::cout << const_reference_to_my_string_vector.size() << std:endl;
}