我知道我可以像这样初始化一个向量:
vector<int> v{1,3,4,6};
Run Code Online (Sandbox Code Playgroud)
但是,当我定义一个包含向量的类时,我无法在我声明它的位置初始化它,如下所示:
class C {
public:
vector<int> v;
C();
};
Run Code Online (Sandbox Code Playgroud)
因此我需要在构造函数中初始化它。以下代码有效,但不干净:
C::C() {
v.resize(4);
v[0]=1;
v[1]=3;
v[2]=4;
v[3]=6;
}
Run Code Online (Sandbox Code Playgroud)
我怎么能像初始化一样整齐直接地初始化它,vector<int> v{1,3,4,6};而不是一个一个地赋值?
编辑:也许我没有把我的情况说清楚。{1,3,4 6} 的值可能不是预定义的值,它们取决于一些逻辑和条件:if(condition_a) {v[0] = 0; v[1]=3; ...} else {v[0]=4;v[0]=8;...}. 因此,我必须处理其他一些事情才能知道如何初始化这个向量,所以我不能按照某些答案中的建议使用初始化列表。请问有什么建议吗?
我有一个以整数向量为键的地图。我用值的关键向量初始化地图{1, 2, 3}
typedef std::map<std::vector<int>, std::string> VectorMap;
VectorMap vectorMap;
vectorMap[std::vector<int>{1, 2, 3}] = "test";
Run Code Online (Sandbox Code Playgroud)
然后我使用count方法来显示是否可以通过向量{1, 2, 3}作为关键字找到VectorMap中的条目。
std::cout << "count: " << vectorMap.count(std::vector<int>{1, 2, 3}) << std::endl;
Run Code Online (Sandbox Code Playgroud)
这将返回正确的计数。
数:1
但是我想这样做,所以向量中整数的顺序无关紧要。所以我尝试与上述相同但矢量内容翻转即{3, 2, 1}
std::cout << "count: " << vectorMap.count(std::vector<int>{3, 2, 1}) << std::endl;
Run Code Online (Sandbox Code Playgroud)
这将返回 0 的计数。
计数:0
我想让矢量比较与内容的顺序无关,只要内容相同。
{1, 2, 3} count: 1
{3, 2, 1} count: 1
{1, 2} count: 0
{1, 2, 3, 4} count : 0
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?我应该完全使用不同的容器而不是 std::vector 吗?
我对 C++ 很陌生,我曾尝试寻找这个问题的答案并运行测试,但很多时候我无法弄清楚是什么导致了特定行为。我的问题与使用嵌套[ ]运算符访问或修改循环中的元素有关 - 例如:
//Declare
std::vector<int> a1 {10,20,30,40} ;
std::vector<int> a2 {2,3} ;
int S2 = a2.size() ;
//Loop
for(int i = 0 ; i < S2 ; i++){
a1[a2[i]] = a1[a2[i]] + 5000 ;
}
Run Code Online (Sandbox Code Playgroud)
这被认为可以吗?我不仅要问一般做法,还要问效率和我需要考虑的任何其他潜在因素。我是否应该首先存储a[i]在循环内的临时变量中,然后使用它来修改 vector 中的元素a2?
我确实知道它可能不是最好的结构,我应该使用其他一些数据结构来做这种事情,但我只想了解这是否可以或者是否可能导致一些未定义的行为。
有这个代码:
#include <map>
#include <string>
#include <vector>
void foo1(const std::map<std::string, int> &m)
{
m["abcd"];
}
void foo2(const std::vector<std::vector<int>> &v)
{
v[0];
}
Run Code Online (Sandbox Code Playgroud)
只给出错误foo1,但不给出错误foo2。据我了解map-> 它有 2 个数组 - 一个用于键,第二个用于值。我明白 aconst map给了我const int作为价值。但也应该如此vector<vector<int>>,因为访问元素 via[]也是const vector<int>,但被允许。此外,通过访问值[]并不立即意味着我想要write一个数据。我只能读取那个值,那为什么甚至const map没有operator[]?(当编译器不知道我是想写还是读时)。
问题在于语言设计,而不是标准报价。正如在评论中一样 -> 你需要 1 个操作符来写 map operator[]。但是需要 2 个运算符来进行向量写入operator[], operator=。为什么map::operator[]自动期望我要写?(因此通过提供的键创建新元素)?我可以像在 vector 中一样只是尝试从该映射中读取,如果该键(对)不存在,它会给出错误或警告,但无需立即创建它。
我有一个关于这个程序的问题。我是编程和 C++ 的初学者,我试图弄清楚两件事。
为什么这个程序没有编译(错误:使用未初始化的内存“总计” - 我将它定义为一个变量??)。
有人能解释一下 main ( sumUpTo)之外的函数是如何工作的吗?具体& vec和total,因为我从来没有见过他们。谢谢。
/* 1) read in numbers from user input, into vector -DONE
2) Include a prompt for user to choose to stop inputting numbers - DONE
3) ask user how many nums they want to sum from vector -
4) print the sum of the first (e.g. 3 if user chooses) elements in vector.*/
#include <iostream>
#include <string>
#include <vector>
#include <numeric> //for accumulate
int …Run Code Online (Sandbox Code Playgroud) 擦除第一个迭代器在最后一个迭代器之后的范围时会发生什么?
std::vector<int> v{1,2};
v.erase(
v.begin() + 1,
v.begin()
);
Run Code Online (Sandbox Code Playgroud)
其他容器呢?
我有一组地图:
std::array<std::map<double, double>, 8> freqMap;
Run Code Online (Sandbox Code Playgroud)
填充它时,我需要在不同的数组索引处向地图添加条目。我知道我可以创建 8 个不同的地图,填充它们,然后将它们添加到数组中,但是是否可以直接在数组中将条目附加到地图?
例如,我如何将着手添加的映射条目key5.0,val3.3至数组索引2,然后添加另一条目数组索引3,然后附加另一条目索引2再次等。
我也可以使用std::vector地图,但仍然看不到以这种方式添加条目的方法。
这是一个例子。我正在从文件中读取数据并想直接更新我的数据结构:
while (fin >> arrayIdx >> key>> val)
freqMaps[arrayIdx] = ??
Run Code Online (Sandbox Code Playgroud) 好的,所以我有一个排序的std::vector<std::pair<int,double>>. 我似乎无法找到的是如何根据 std::pair (int) 的“第一个”元素的值从向量中删除条目。我可能会在我的算法中多次执行此操作,因此我不想每次都遍历向量(其中可能包含多达一百万个条目)。我知道我们可以使用 std::erase 或 remove 轻松删除基于索引的元素,但是有没有办法根据对的第一个元素的值来执行此操作?或者我们可以获取该元素的索引然后使用 std::erase 吗?
注意: std::pair 的第一个元素的值对于向量是唯一的。鉴于程序的限制,我需要使用向量(即不能使用地图或不同的容器)。
示例:我有一个容器:
std::vector<std::pair<int,double>> vec = { {20, 60.3}, ... {10, -20.2}, {1020, -80.9}};
Run Code Online (Sandbox Code Playgroud)
我想从向量中快速删除第一个元素 == 10 的元素,但我不知道它位于向量的哪个索引处。
有没有一种简单的方法可以将 std::string 转换为 std::vector 我想让用户输入任何长度的字符串,然后有一个动态字符数组(向量)。
#include<iostream>
#include<vector>
#include<string>
int main() {
std::vector<char> word;
std::string strWord;
std::getline(std::cin, strWord);
//What comes next?
}
Run Code Online (Sandbox Code Playgroud)
我尝试过但不起作用的一件事是:
strcpy(word, strWord);
我收到错误消息,没有从“std::string”到“const char*”的合适转换存在。因此,由于“word”是指向 char 数组的指针,我该如何添加字符串?
我够大
std::vector<byte> source
Run Code Online (Sandbox Code Playgroud)
我需要从向量中的任何偏移量中获取四个字节(例如,10-13 个字节)并将其转换为整数。
int ByteVector2Int(std::vector &source, int offset)
{
return (source[offset] | source[offset + 1] << 8 | source[offset + 2] << 16 | source[offset + 3] << 24);
}
Run Code Online (Sandbox Code Playgroud)
这种方法太冒犯了,我如何才能以最大的性能做到这一点?