0

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

对于这个函数,“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>转换为char”,我不明白为什么,因为我正在处理相同类型的字符。“没有'='这样的操作”??

我不明白为什么。有人可以解释吗?也许我的逻辑是错误的,所以有人可以帮我重写它吗?

我希望它垂直反射/镜像它。

4

3 回答 3

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;
  }
}

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

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;
  }
}
于 2013-05-08T19:56:53.083 回答
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;
}
于 2013-05-08T20:17:28.810 回答
0

问题在于: art[i].begin()+j=swap[j] 你想做什么?将字符“swap[j]”分配给整数?

于 2013-05-08T20:01:41.787 回答