如何将整数向量插入键,值 std::map
How to insert vector of integers into Key, Value of std::map
目标: 将数字文本文件读入向量,然后将向量添加到键,值 std::map
以便我可以通过我指定的键名引用它们对于他们,稍后。
我认为这很容易,令我惊讶的是我已经在 Whosebug 上找不到这方面的答案了。
预期结果:
Print1 = {100,200,500,600}
Print2 = {7890,5678,34567,3,56}
Print3["NameA"] = Print1
Print3["NameB"] = Print2
如果我的过程效率低下或方向错误,我将不胜感激。
我不断收到语义问题构建失败并且无法从 pair <const basic_string>
进行可行的转换
当前代码:
#include <string.h>
#include <iostream>
#include <map>
#include <utility>
#include <vector>
const std::string& key(const std::pair<std::string, std::string>& keyValue)
{
return keyValue.first;
}
const std::string& value(const std::pair<std::string, std::string>& keyValue)
{
return keyValue.second;
}
int main()
{
std::vector<int> print1;
std::ifstream inputFile("numbers.txt");
// test file open
if (inputFile)
{
double value;
// read the elements in the file into a vector
while ( inputFile >> value ) {
print1.push_back(value);
}
}
inputFile.close();
std::vector<int> print2;
std::ifstream inputFile2("numbers2.txt");
// test file open
if (inputFile2)
{
double value;
// read the elements in the file into a vector
while ( inputFile2 >> value ) {
print2.push_back(value);
}
}
inputFile2.close();
std::map<std::string, std::vector<int>> contacts;
contacts["alice"] = print1;
contacts["bob"] = print2;
std::vector<std::string> keys(contacts.size());
std::vector<int> values(contacts.size());
transform(contacts.begin(), contacts.end(), keys.begin(), key);
transform(contacts.begin(), contacts.end(), values.begin(), value);
std::cout << "Keys:\n";
copy(keys.begin(), keys.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
std::cout << "\n";
std::cout << "Values:\n";
copy(values.begin(), values.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
return 0;
}
首先,争论 Xcode 没有为您的代码显示任何错误消息是没有意义的。尝试打开所有编译器警告或尝试在线编译器。结果不会令人失望:https://godbolt.org/z/cU54GX
如果我没理解错的话,您想将来自两个文件(整数值)的信息存储在 std::map
中,其中它的键 = std::string
和值 = vector of integer array
.
如果是,
1。从从文件中读取整数开始,您就遇到了问题。
您无缘无故地使用 double
并存储到
std::vector<int>
(我,e print1
和 print2
)。
2。其次,如果您的文件尚未打开怎么办? inputFile.close();
inputFile2.close();
无论如何都会关闭它,而不知道
事实。这是错误的。
正确的方法是:
inputFile.open("numbers.txt", std::ios::in); // opening mode
if (inputFile.is_open()) {
// do stuff
inputFile.close(); // you need closing only when file has been opened
}
3。如果你的意图是只打印 keys
和 values
,你不需要
需要将它们解析为不同的向量。
你可以直接做:
for(const std::pair<kType, vType>& mapEntry: contacts)
{
std::cout << "Key: " << mapEntry.first << " Values: ";
for(const int values: mapEntry.second) std::cout << values << " ";
std::cout << std::endl;
}
在c++17中你可以使用Structured binding
for(const auto& [Key, Values]: contacts)
{
std::cout << "Key: " << Key << " Values: ";
for(const int value: Values) std::cout << value << " ";
std::cout << std::endl;
}
4。如果您真的想将它们解析为不同的向量;首先,存储keys
的数据结构是错误的:
std::vector<int> values(contacts.size());
^^^^^^
这应该是整数向量的向量,就像你的vType = std::vector<int>
。也就是说,
std::vector<std::vector<int>> values
^^^^^^^^^^^^^^^^^^
其次,你的函数 key(const std::pair<std::string, std::string>& keyValue)
和 value(const std::pair<std::string, std::string>& keyValue)
是错误的,你传递了一对 字符串 作为键和值。
这应该是
typedef std::string kType; // type of your map's key
typedef std::vector<int> vType;// value of your map's value
std::pair<kType, vType>
但是,您可以简单地用 lambda 替换,这样会更直观,因为函数就在您需要的行旁边。例如,
std::vector<kType> keysVec;
keysVec.reserve(contacts.size());
auto getOnlyKeys = [](const std::pair<kType, vType>& mapEntry){ return mapEntry.first; };
std::transform(contacts.begin(), contacts.end(), std::back_inserter(keysVec), getOnlyKeys);
你可以直接引用map元素,如果不存在就会创建一个条目,然后从文件读取循环中填充它:
#include <iostream>
#include <fstream>
#include <map>
#include <vector>
#include <string>
int main()
{
std::map<std::string, std::vector<int>> m;
int num;
auto &&alice = m["alice"];
std::ifstream if_alice("numbers1.txt");
while (if_alice >> num)
alice.push_back(num);
if_alice.close();
auto &&bob = m["bob"];
std::ifstream if_bob("numbers2.txt");
while (if_bob >> num)
bob.push_back(num);
if_bob.close();
// test
for (auto &&data : m)
{
std::cout << "Name: " << data.first << "\t";
for (int num : data.second)
std::cout << num << " ";
std::cout << "\n";
}
}
目标: 将数字文本文件读入向量,然后将向量添加到键,值 std::map
以便我可以通过我指定的键名引用它们对于他们,稍后。
我认为这很容易,令我惊讶的是我已经在 Whosebug 上找不到这方面的答案了。
预期结果:
Print1 = {100,200,500,600}
Print2 = {7890,5678,34567,3,56}
Print3["NameA"] = Print1
Print3["NameB"] = Print2
如果我的过程效率低下或方向错误,我将不胜感激。
我不断收到语义问题构建失败并且无法从 pair <const basic_string>
当前代码:
#include <string.h>
#include <iostream>
#include <map>
#include <utility>
#include <vector>
const std::string& key(const std::pair<std::string, std::string>& keyValue)
{
return keyValue.first;
}
const std::string& value(const std::pair<std::string, std::string>& keyValue)
{
return keyValue.second;
}
int main()
{
std::vector<int> print1;
std::ifstream inputFile("numbers.txt");
// test file open
if (inputFile)
{
double value;
// read the elements in the file into a vector
while ( inputFile >> value ) {
print1.push_back(value);
}
}
inputFile.close();
std::vector<int> print2;
std::ifstream inputFile2("numbers2.txt");
// test file open
if (inputFile2)
{
double value;
// read the elements in the file into a vector
while ( inputFile2 >> value ) {
print2.push_back(value);
}
}
inputFile2.close();
std::map<std::string, std::vector<int>> contacts;
contacts["alice"] = print1;
contacts["bob"] = print2;
std::vector<std::string> keys(contacts.size());
std::vector<int> values(contacts.size());
transform(contacts.begin(), contacts.end(), keys.begin(), key);
transform(contacts.begin(), contacts.end(), values.begin(), value);
std::cout << "Keys:\n";
copy(keys.begin(), keys.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
std::cout << "\n";
std::cout << "Values:\n";
copy(values.begin(), values.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
return 0;
}
首先,争论 Xcode 没有为您的代码显示任何错误消息是没有意义的。尝试打开所有编译器警告或尝试在线编译器。结果不会令人失望:https://godbolt.org/z/cU54GX
如果我没理解错的话,您想将来自两个文件(整数值)的信息存储在 std::map
中,其中它的键 = std::string
和值 = vector of integer array
.
如果是,
1。从从文件中读取整数开始,您就遇到了问题。
您无缘无故地使用 double
并存储到
std::vector<int>
(我,e print1
和 print2
)。
2。其次,如果您的文件尚未打开怎么办? inputFile.close();
inputFile2.close();
无论如何都会关闭它,而不知道
事实。这是错误的。
正确的方法是:
inputFile.open("numbers.txt", std::ios::in); // opening mode
if (inputFile.is_open()) {
// do stuff
inputFile.close(); // you need closing only when file has been opened
}
3。如果你的意图是只打印 keys
和 values
,你不需要
需要将它们解析为不同的向量。
你可以直接做:
for(const std::pair<kType, vType>& mapEntry: contacts)
{
std::cout << "Key: " << mapEntry.first << " Values: ";
for(const int values: mapEntry.second) std::cout << values << " ";
std::cout << std::endl;
}
在c++17中你可以使用Structured binding
for(const auto& [Key, Values]: contacts)
{
std::cout << "Key: " << Key << " Values: ";
for(const int value: Values) std::cout << value << " ";
std::cout << std::endl;
}
4。如果您真的想将它们解析为不同的向量;首先,存储keys
的数据结构是错误的:
std::vector<int> values(contacts.size());
^^^^^^
这应该是整数向量的向量,就像你的vType = std::vector<int>
。也就是说,
std::vector<std::vector<int>> values
^^^^^^^^^^^^^^^^^^
其次,你的函数 key(const std::pair<std::string, std::string>& keyValue)
和 value(const std::pair<std::string, std::string>& keyValue)
是错误的,你传递了一对 字符串 作为键和值。
这应该是
typedef std::string kType; // type of your map's key
typedef std::vector<int> vType;// value of your map's value
std::pair<kType, vType>
但是,您可以简单地用 lambda 替换,这样会更直观,因为函数就在您需要的行旁边。例如,
std::vector<kType> keysVec;
keysVec.reserve(contacts.size());
auto getOnlyKeys = [](const std::pair<kType, vType>& mapEntry){ return mapEntry.first; };
std::transform(contacts.begin(), contacts.end(), std::back_inserter(keysVec), getOnlyKeys);
你可以直接引用map元素,如果不存在就会创建一个条目,然后从文件读取循环中填充它:
#include <iostream>
#include <fstream>
#include <map>
#include <vector>
#include <string>
int main()
{
std::map<std::string, std::vector<int>> m;
int num;
auto &&alice = m["alice"];
std::ifstream if_alice("numbers1.txt");
while (if_alice >> num)
alice.push_back(num);
if_alice.close();
auto &&bob = m["bob"];
std::ifstream if_bob("numbers2.txt");
while (if_bob >> num)
bob.push_back(num);
if_bob.close();
// test
for (auto &&data : m)
{
std::cout << "Name: " << data.first << "\t";
for (int num : data.second)
std::cout << num << " ";
std::cout << "\n";
}
}