gpt4 book ai didi

c++ - 嵌套列表(字符串 vector 的 vector )初始化失败

转载 作者:IT老高 更新时间:2023-10-28 22:02:47 26 4
gpt4 key购买 nike

这段代码:

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

class MyClass
{
public:
MyClass(const std::vector<std::vector<std::string>> & v)
{
std::cout << "Vector of string vectors size: " << v.size() << "\n";

for (size_t i = 0; i < v.size(); i++)
std::cout << "Vector #" << i << " has size " << v[i].size() << "\n";
}
};

int main()
{
MyClass({ { "a" } }); // <--- ok
MyClass({ { "a", "b" } }); // <--- PROBLEM
MyClass({ { std::string("a"), "b" } }); // <--- ok
MyClass({ { "a", "b", "c" } }); // <--- ok
MyClass({ { "a" },{ "c" } }); // <--- ok
MyClass({ { "a", "b" },{ "c", "d" } }); // <--- ok
}

输出这个(Visual Studio 2017):

Vector of string vectors size: 1
Vector #0 has size 1
Vector of string vectors size: 4
Vector #0 has size 97
Vector #1 has size 0
Vector #2 has size 0
Vector #3 has size 0
Vector of string vectors size: 1
Vector #0 has size 2
Vector of string vectors size: 1
Vector #0 has size 3
Vector of string vectors size: 2
Vector #0 has size 1
Vector #1 has size 1
Vector of string vectors size: 2
Vector #0 has size 2
Vector #1 has size 2

所以,它在所有情况下都可以正常工作,除了我们有一个包含两个字符串的 vector 的 vector 的情况。如果我们从字符串文字之一显式构造 std::string ,它也适用于上述情况。如果两者都只是简单的字符串文字,编译器似乎会“混淆”并构造一个包含 4 个项目的 vector ,其中第一个包含 97 个字符串。注意97是“a”的字符代码。

我想我的问题是,编译器是否应该像我预期的那样解释这个有问题的构造,还是用这个糟糕的代码来初始化这样的嵌套列表?

最佳答案

MyClass({ { "a", "b" } }) 中的内部 vector 正在使用范围构造函数创建:

template <class InputIterator>
vector (InputIterator first, InputIterator last, const allocator_type& alloc = allocator_type());

发生这种情况是因为 { "a", "b" }不被解释为 std::initializer_list<std::string>但作为一对原始指针。

关于c++ - 嵌套列表(字符串 vector 的 vector )初始化失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49979979/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com