【问题标题】:insert string into vector character by character将字符串逐个字符插入向量中
【发布时间】:2018-08-14 02:58:02
【问题描述】:

我正在尝试将字符串中的字符插入到 char 向量中,但以相反的顺序放置字母。谁能告诉我为什么这不起作用

int main()
{
    string a = "Hello";

    vector<char> arr(5);

    for(int i = 4 ; i  ==   0 ; i--)
    {
        arr.push_back(a[i]);
        cout << arr[i];

    }
    return 0;
}

我试图以相反的顺序将角色推回 1 x 1

【问题讨论】:

  • 确保在发布问题时也指定当前不良行为是什么。
  • 我正试图以相反的顺序将字符推回 1 x 1 -- 为什么是 1 x 1?一次完成所有事情:vector&lt;char&gt; arr(a.rbegin(), a.rend());
  • 您不应该在回答了原始问题后继续提出新问题。它使答案无效。只需接受最佳答案,然后在需要时打开一个新问题。
  • 我看不出你的回答对 @Galik 有什么帮助,感谢 paulMckenzie,这很有用!

标签: c++ arrays vector char push-back


【解决方案1】:

他们的代码有几个问题:

  • 您正在创建一个 vector,其 size 最初为 5,然后您尝试将 5 个 additional 字符推入其中,总共 10 个字符。您需要:

    • 初始化它的容量而不是它的大小

    • 按原样初始化 size,但在循环中使用 arr[4-i] 而不是 arr.push_back()

  • 您的循环根本不会进入,因为i == 0 永远不会为真。

尝试类似的方法:

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main() {
    string a = "Hello";
    size_t len = a.size();

    vector<char> arr;
    arr.reserve(len);

    for(int i = len-1; i >= 0; i--) {
        arr.push_back(a[i]);
    }

    for(size_t i = 0; i < len; ++i) {
        cout << arr[i];
    }

    return 0;
}

或者:

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main() {
    string a = "Hello";
    size_t len = a.size();

    vector<char> arr(len);

    for(int i = len-1; i >= 0; i--) {
        arr[len-1-i] = a[i];
    }

    for(size_t i = 0; i < len; ++i) {
        cout << arr[i];
    }

    return 0;
}

以更 C++ 的方式处理此问题的另一种方法是使用迭代器:

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main() {
    string a = "Hello";

    vector<char> arr;
    arr.reserve(a.size());

    for(auto iter = a.rbegin(); iter != a.rend(); ++iter) {
        arr.push_back(*iter);
    }

    for(auto ch : arr) {
        cout << ch;
    }

    return 0;
}

或者:

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main() {
    string a = "Hello";

    vector<char> arr(a.size());
    auto arr_iter = arr.begin();

    for(auto a_iter = a.rbegin(); a_iter != a.rend(); ++a_iter, ++arr_iter) {
        *arr_iter = *a_iter;
    }

    for(auto ch : arr) {
        cout << ch;
    }

    return 0;
}

然后您就可以完全摆脱手动循环:

#include <iostream>
#include <string>
#include <vector>
#include <iterator>
#include <algorithm>
using namespace std;

int main() {
    string a = "Hello";

    vector<char> arr;
    arr.reserve(a.size());

    copy(a.rbegin(), a.rend(), back_inserter(arr));

    cout.write(arr.data(), arr.size());

    return 0;
}

或者:

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    string a = "Hello";

    vector<char> arr(a.size());

    copy(a.rbegin(), a.rend(), arr.begin());

    cout.write(arr.data(), arr.size());

    return 0;
}

或者:

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main() {
    string a = "Hello";

    vector<char> arr(a.rbegin(), a.rend());
    cout.write(arr.data(), arr.size());

    return 0;
}

【讨论】:

  • @jejo 抱歉,我是新手,但我想我现在才接受答案
【解决方案2】:

我不知道为什么当向量完全能够在构造函数中使用 iterator 时,你为什么要把事情复杂化?因此,您的大部分代码都可以替换为简单的:

vector<char> arr(a.rbegin(), a.rend());

下面的完整程序显示了这一点:

#include <iostream>
#include <string>
#include <vector>

using std::cout; using std::string; using std::vector;

int main() {
    string a = ")-: yug emosdnah a si xaP";
    vector<char> arr(a.rbegin(), a.rend());
    for (auto ch: arr) cout << ch;
    cout << '\n';
}

【讨论】:

    【解决方案3】:
    for(int i = 4 ; i  ==   0 ; i--)
    

    这意味着在 i 等于 0 时继续运行 - 但 i 从 4 开始,所以 for 循环立即终止。

    你可能是说

    for(int i = 4 ; i  >=   0 ; i--)
    

    【讨论】:

    • 我按照建议做了,这次只打印出 5 个空格
    • 另一个答案得到了另一部分 - 您正在创建一个包含 5 个空点的向量。在 arr(5) 中丢失了 5。
    猜你喜欢
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    • 2017-03-18
    • 2016-09-12
    • 1970-01-01
    • 2018-02-07
    • 1970-01-01
    相关资源
    最近更新 更多